數組的相關處理函數

1、數組的鍵、值操作函數

2、統計數組元素的個數與唯一性

3、使用回調函數處理數組的函數

4、數組的排序函數

5、拆分、合併、分解與結合數組

6、數組與數據結構

7、其他有用的數組處理函數





1、數組的鍵、值操作函數


array_values();

用途:返回數組中所有的值

格式:array array_values ( array input )


array_keys();

用途:返回數組中所有的鍵名

格式:array array_keys(array input[,mixed search_value [,bool strict]])   其中search_value爲空則只返回該值的鍵名


in_array();

用途:檢查數組中是否存在某個值

格式:bool in_array(mixed needle, array haystack [,bool strict]) 其中strict參數:是否匹配類型


array_flip();

用途:交換數組中的鍵和值

格式:array array_flip(array trans)


array_reverse()

用途:返回一個單元順序相反的數組

格式:array array_reverse ( array array [, bool preserve_keys] )    如果 preserve_keys 爲 TRUE 則保留原來的鍵名


案例:

$arr = ['rose','lily','xiaoxue','jack','xiaoming','jack'];


/獲取一個數組所有的鍵,以索引數組形式返回
$result =array_keys($arr);
print_r($result);

//獲取一個數組所有的值,以索引數組形式返回
$result = array_values($arr);
print_r($result);

// in_array() 可以用於判斷上傳文件格式是否符合要求。$arr = ['jpg','png','gif'];
// $result = in_array('jacky',$arr);
// var_dump($result);

if(in_array('jackok',$arr)){
    echo 'jack存在於$arr數組中';
}else{
    echo 'jack不存在於$arr數組中';
}

// 翻轉鍵值
$brr = array_flip($arr);
print_r($brr);

// 翻轉數組順序
$arr = ['rose','lily','xiaoxue','jack','xiaoming','ajack'];
print_r(array_reverse($arr,true));


2、統計數組元素的個數與唯一性


count();

用途:計算數組中的單元數目或對象中的屬性個數


案例:

$arr = ['rose','lily','xiaoxue','jack','xiaoming','ajack'];
//返回數組單元個數或者對象成員屬性個數
echo count($arr);


array_count_values();

用途:統計數組中所有的值出現的次數


array_unique();

用途:移除數組中重複的值


案例:

<?php
$arr = ['a','b','a','c','d','c','a','b'];

//統計數組單元值出現的次數
$brr = array_count_values($arr);

//移除數組中重複的值 
$crr = array_unique($arr);
print_r($crr);   


結果:

Array
(
    [a] => 3
    [b] => 2
    [c] => 2
    [d] => 1
)
Array
(
    [0=> a
    [1=> b
    [3=> c
    [5=> d
)



3、使用回調函數處理數組的函數

array_filter();

用途:用回調函數過濾數組中的單元

格式:array array_filter(array input [,callback callback])

解釋:依次將input數組中的每個值傳遞callback函數

  • 如果callback函數返回TRUE,則input數組的當前值會被包含在返回的結果數組中。數組的鍵名保留不變。

  • 如果沒有提供callback函數,array_filter()將刪除input中所有等值爲FALSE的條目。

案例1:非空!empty

<?php
include 'db.php';
$sql = "select * from bbs_content limit 1";
$data = select($sql)[0];
echo '<pre>';


//用回調函數過濾數組中的單元
$result = array_filter($data,'myfunc');

function myfunc($x)
{
    return !empty($x);
}

print_r($result);


結果:

Array
(
    [id] => 1
    [pid] => 4
    [uid] => 1
    [title] => 阿斯頓發送到
    [content] =>

    [edittime] => 1398212373
    [posttime] => 1398212373
    [visittimes] => 1
    [cost] => 10
    [ip] => 2130706433
    [isopen] => 1
)


案例2(上邊結果的反例):空empty

//用回調函數過濾數組中的單元
$result = array_filter($data,'myfunc');

function myfunc($x)
{
    return empty($x);
}

print_r($result);

結果:

Array
(
    [pic] =>
    [keywords] =>
    [description] =>
    [ishot] => 0
    [isjinghua] => 0
    [istop] => 0
    [allowlevel] => 0
    [needreply] => 0
    [inbox] => 0
)


案例3:

$arr = [0,1,2,3,true,false,null];

$result = array_filter($arr,'fun');

function fun($a)
{
    if($a){
        return true;
    }else{
        return false;
    }
}

print_r($result);


案例三的簡化:


$result = array_filter($arr,function($x){ return $x;});
print_r($result);


結果都爲:

Array
(
    [1=> 1
    [2=> 2
    [3=> 3
    [4=> 1
)


array_walk();

用途:對數組中的每個成員應用用戶函數

格式:bool array_walk(array &array, callback funcname[,mixed userdata])

解釋:如果成功則返回 TRUE,失敗則返回 FALSE。

           將用戶自定義函數 funcname 應用到 array 數組中的每個單元。典型情況下 funcname 接受兩個參數。array 參數的值作爲第一個,鍵名作爲第二個。如果提供了可選參數 userdata,將被作爲第三個參數傳遞給 callback funcname。 

           array_walk() 不會受到 array 內部數組指針的影響。array_walk() 會遍歷整個數組而不管指針的位置。 


案例:

<?php
$arr = ['apple','li','banana','xigua','taozi'];
echo '<pre>';

//對數組中的每個成員應用用戶函數
array_walk($arr,"myfun");

function myfun(&$v,$k)
{
    $v .= 'lai 2 jin';
}

print_r($arr);

array_walk($arr,'fun','abc');

function fun(&$v,$k,$u)
{
    $v.=$u;
}

print_r($arr);


結果:


Array
(
    [0=> applelai 2 jin
    [1=> lilai 2 jin
    [2=> bananalai 2 jin
    [3=> xigualai 2 jin
    [4=> taozilai 2 jin
)
Array
(
    [0=> applelai 2 jinabc
    [1=> lilai 2 jinabc
    [2=> bananalai 2 jinabc
    [3=> xigualai 2 jinabc
    [4=> taozilai 2 jinabc
)


疑問:array 參數的值作爲第一個,鍵名作爲第二個。爲什麼輸出鍵名爲索引下標?



array_map(); 

用途:將回調函數作用到給定數組的單元上

格式:array array_map ( callback callback, array arr1 [, array ...] )

解釋:array_map() 返回一個數組,該數組包含了 arr1 中的所有單元經過 callback 作用過之後的單元。callback 接受的參數數目應該和傳遞給 array_map() 函數的數組數目一致


案例:


<?php
$arr = [10,100,20,60,50,60];
$brr = [11,21,31,41,51,61,71];

//將回調函數作用到給定數組的單元上 
$result = array_map('myfun',$arr);

function myfun($x)
{
    return $x += 10;
}

echo '<pre>';
print_r($result);


$result  = array_map('fun',$arr,$brr);
function fun($x,$y)
{
    return $x + $y;
}
print_r($result);

 

結果:

Array
(
    [0=> 20
    [1=> 110
    [2=> 30
    [3=> 70
    [4=> 60
    [5=> 70
)
Array
(
    [0=> 21
    [1=> 121
    [2=> 51
    [3=> 101
    [4=> 101
    [5=> 121
    [6=> 71
)


4、數組的排序函數


sort -- 對數組排序(升序)

rsort -- 對數組逆向排序(降序)

usort --  使用用戶自定義的比較函數對數組中的值進行排序


案例:

<?php
$arr = [10,100,20,60,50,60];
echo '<pre>';
/*
//對數組排序(升序)
sort($arr);
//對數組排序(降序)
rsort($arr);


print_r($arr);
*/


usort($arr,'myfun');

function myfun($a,$b)
{
   retrun $a-$b;
}
print_r($arr);


結果:

Array
(
    [0=> 10
    [1=> 20
    [2=> 50
    [3=> 60
    [4=> 60
    [5=> 100
)


asort -- 對數組進行排序並保持索引關係(關聯數組排序)

arsort --  對數組進行逆向排序並保持索引關係 

uasort --  用戶自定義的比較函數對數組進行排序並保持索引關係


案例:

<?php
header("content-type:text/html;charset=utf-8");
$users = ['user1' => 'xiongda','user2' => 'xiaohei','user3'=>'xibobai'];
echo '<pre>';
//對數組進行升序排序並保持索引關係
// asort($users);

//對數組進行降序排序並保持索引關係
// arsort($users);

//使用用戶自定義函數,對數組進行排序並保持索引關係
uasort($users,'myfun');

function myfun($a,$b)
{
    if($a > $b){
        return 1;
    }
    if($a < $b){
        return -1;
    }
    if($a == $b){
        return 0;
    }
}
print_r($users);


結果:

Array
(
    [user2=> xiaohei
    [user3=> xibobai
    [user1=> xiongda
)


ksort -- 對數組按照鍵名排序

krsort -- 對數組按照鍵名逆向排序

uksort --  使用用戶自定義的比較函數對數組中的鍵名進行排序


案例:

<?php
header("content-type:text/html;charset=utf-8");
$users = ['user6' => 'xiongda','user2' => 'xiaohei','user1'=>'xibobai'];

// 對數組按照鍵名升序排序
ksort($users);

// 對數組按照鍵名降序排序
krsort($users);

//使用用戶自定義的比較函數對數組中的鍵名進行排序 
uksort($users,'myfun');

function myfun($a,$b)
{
    if($a > $b){
        return 1;
    }
    if($a < $b){
        return -1;
    }
    if($a == $b){
        return 0;
    }
}
echo '<pre>';

print_r($users);


結果:

Array

(
    [user1] => xibobai
    [user2] => xiaohei
    [user6] => xiongda
)


natsort --  用“自然排序”算法對數組排序

natcasesort --  用“自然排序”算法對數組不區分大小寫字母排序 

array_multisort -- 對多個數組或多維數組進行排序


案例:

<?php
$arr = ['image123','Image102','image120','Image1202','image1231'];

echo '<pre>';
sort($arr);

print_r($arr);
echo '<hr>';
// 自然排序
natsort($arr);
print_r($arr);
echo '<hr>';

// 不區分大小寫自然排序
natcasesort($arr);
print_r($arr);


結果:

Array
(
    [0=> Image102
    [1=> Image1202
    [2=> image120
    [3=> image123
    [4=> image1231
)按照ASCII碼排序


Array
(
    [0=> Image102
    [1=> Image1202
    [2=> image120
    [3=> image123
    [4=> image1231
)按照ASCII碼排序


Array
(
    [0=> Image102
    [2=> image120
    [3=> image123
    [1=> Image1202
    [4=> image1231
)不區分大小寫自然排序


 

sort 和natsort的比較:sort按位排序

<?php

//image全是小寫i
$arr = ['image123','image102','image120','image1202','image1231'];

echo '<pre>';
sort($arr);

print_r($arr);
echo '<hr>';
// 自然排序
natsort($arr);
print_r($arr);


結果:

Array
(
    [0=> image102
    [1=> image120
    [2=> image1202
    [3=> image123
    [4=> image1231
)
Array
(
    [0=> image102
    [1=> image120
    [3=> image123
    [2=> image1202
    [4=> image1231
)


 

array_multisort -- 對多個數組或多維數組進行排序


<?php
include 'db.php';
$sql = 'select regtime,username,money,email from bbs_user limit 3';
$data = select($sql);

echo '<pre>';
// print_r($data);

foreach($data as $v){
    $email[] = $v['email'];
    $username[] = $v['username'];
    $regtime[]=$v['regtime'];
}

// print_r($email);
// print_r($username);

//多維數組排序
array_multisort($username,SORT_DESC,$regtime,SORT_ASC,$email,SORT_ASC,$data);
print_r($data);


結果:

Array
(
    [0=> Array
        (
            [regtime] => 1397632974
            [username] => jackyok
            [money] => 100
            [email] => [email protected]
        )
 
    [1=> Array
        (
            [regtime] => 1397632773
            [username] => jack
            [money] => 100
            [email] => 50377203@qq.com
        )
 
    [2=> Array
        (
            [regtime] => 1397633371
            [username] => alibaba
            [money] => 100
            [email] => 50377203@qq.com
        )
 
)


 5、拆分、合併、分解與結合數組

array_slice -- 從數組中取出一段 

<?php
$arr = ['a','b','c','d','e','f'];
// $result = array_slice($arr,3);
$result = array_slice($arr,-4,-1);

var_dump($result);

結果:

array(3) { [0]=> string(1) "c" [1]=> string(1) "d" [2]=> string(1) "e" }


array_splice --  把數組中的一部分去掉並用其它值取代 


<?php
$arr = ['a','b','c','d','e','f'];

// $brr = array_splice($arr,1,1,'x');
// $brr = array_splice($arr,1);
// $brr = array_splice($arr,-1);

// $brr = array_splice($arr,1,1);
// $brr = array_splice($arr,1,-1);

// $brr = array_splice($arr,-3,1);
// $brr = array_splice($arr,-3,-1,['x','y']);
$brr = array_splice($arr,-3,-1,array(array('a','b')));
echo '<pre>';
print_r($arr);

echo '<hr>';
print_r($brr);

結果:

Array

(

    [0] => a

    [1] => b

    [2] => c

    [3] => Array

        (

            [0] => a

            [1] => b

        )

 

    [4] => f

)


Array

(

    [0] => d

    [1] => e

)


array_combine --  創建一個數組,用一個數組的值作爲其鍵名,另一個數組的值作爲其值 


<?php
$arr = ['a','b','c','d'];
$brr = ['huanggua','mangguo','taozi','boluo'];

// 創建一個數組,用一個數組的值作爲其鍵名,另一個數組的值作爲其值
$crr = array_combine($arr,$brr);
echo '<pre>';
print_r($crr);

結果:

Array

(

    [a] => huanggua

    [b] => mangguo

    [c] => taozi

    [d] => boluo

)


array_merge -- 合併一個或多個數組


<?php
$arr = array('xiaorui',10=>'enzhu','jingjing','user1'=>'minghui','caojie');
$brr = array('zhangtao','hongli',10=>'fengtao','henian','user1'=>'haijing');

//合併一個或多個數組,鍵名同名的後面的會把前邊的覆蓋掉
$crr = array_merge($arr,$brr);

echo '<pre>';
print_r($crr);

結果:

Array

(

    [0] => xiaorui

    [1] => enzhu

    [2] => jingjing

    [user1] => haijing

    [3] => caojie

    [4] => zhangtao

    [5] => hongli

    [6] => fengtao

    [7] => henian

)


array_intersect -- 計算數組的交集 

array_diff -- 計算數組的差集 

<?php
$arr = array('xiaorui','enzhu','jingjing','haijing','caojie');
$brr = array('zhangtao','enzhu','fengtao','henian','haijing');

//獲取多個數組交集
// $crr = array_intersect($arr,$brr);

//獲取多個數組差集
$crr = array_diff($arr,$brr);
echo '<pre>';
print_r($crr);


6、數組與數據結構


<?php
$brr = array('zhangtao','enzhu','fengtao','henian','haijing');

//將數組最後一個單元彈出
// $result = array_pop($brr);

//將一個或多個單元壓入數組的末尾(入棧) 
// $result = array_push($brr,'shenchao');


//將數組開頭的單元移出數組 
// $result = array_shift($brr);

//在數組開頭插入一個或多個單元 
// $result = array_unshift($brr,array('cenghao','gaolaoshi'));

echo '<pre>';
print_r($brr);
print_r($result);


array_rand --  從數組中隨機取出一個或多個單元 


<?php
$arr = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20];

// 從數組中隨機取出一個或多個單元 
$keys = array_rand($arr,3);
print_r($keys);


foreach($keys as $v){
    echo $arr[$v].'<br>';
}

 

shuffle -- 將數組打亂


<?php
$arr = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20];

//shuffle — 將數組打亂
shuffle($arr);
print_r($arr);
echo $arr[0].'<br>';
echo $arr[1].'<br>';
echo $arr[2];

//建立一個包含指定範圍單元的數組   
//第一個參數開始位置(最小值) 第二個參數結束位(最大值) 第三個參數步長
$brr = range(1,54,3);
echo '<pre>';
print_r($brr);





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章