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);