PHP中的數組
一、數組的基礎
php數組的分類
按照下標的不同,php分為關聯數組與索引數組:
索引數組:下標從零依次增長(以前那種)
關聯數組:下標為字符串格式,每個下標字符串與數組的值一一關聯對應(有點兒像對象的鍵值對)
[關於關聯數組和索引數組]
1、數組中可同時存在索引數組和關聯數組;
array(1,"one"=>2,3,5=>4,5,6,"9"=>7,8,"haha"=>9);
2、數組中所有的索引數組,如果不加指定,會去掉關聯項默認增長(即關聯數組不占索引位)
array(1,2,"one"=>3,4,5); //1,2,4,5的索引-->0/1/2/3
3、如果,關聯數組的key是純 十進制整數字符串,會將此數字轉為索引數組的索引值;("10.0"/"08"等格式,仍然是關聯數組,不轉為索引)
array(1,2,"one"=>3,"9"=>4,"010"=>5); 1,2,4的索引-->0/1/9
4、如果手動指定關聯數組的key、索引數組的下標,如果與前面已有的key或下標重復,則後指定得值會覆蓋之前的值
array(1,"one"=>2,0=>5,"one"=>6); -->打印數組: 0=>5,"one"=>6
5、如果手動指定索引數組下標,則後續自增長下標,會按照下標最大值,依次增長;
array(1,2,7=>3,4) //1,2,3,4的下標 0/1/7/8
數組的聲明方式
1、直接賦值聲明
$arr[]=1;
$arr[]=1;
$arr[8]=1;
$arr[]=1;
$arr[]=1;
var_dump($arr);
2、字面量聲明
$arr=[1,2,3,4,"one"=>54,6];
var_dump($arr);
3、字面量聲明
$arr=array(1,2,3,4,5);
var_dump($arr);
多維數組
使用多維數組一定要註意,數組中分隔用逗號
原則上,一般不超過3層使用
二、數組的遍歷
使用for循環遍歷數組
count($arr);用於統計數組元素個數
for循環,只能用於遍歷純索引數組,如果存在關聯數組,
count統計時會統計兩種數組的個數,使用for循環
遍歷混合數組,導致數組越界!
$arr=array(1,2,3,"one"=>4,5,6,7); $num=count($arr); //count最好放到函數外面,可以讓函數值執行一次 for($i=0;$i<$num;$i++){ echo "{$i}==>{$arr[$i]}<br>";
foreach循環遍歷數組
foreach可以遍歷任何類型的數組!!!
寫法如下↓↓↓
$arr=array(1,2,"one"=> 6,4,5); foreach($arr as $item){ echo "{$item}<br>"; } foreach($arr as $key=> $item){ echo "{$key}==>{$item}<br>"; }
使用list(),each(),while(),遍歷函數
list():用於將數組的每個值,賦值給list函數的每一個參數,(list函數的參數,必須小於等於數組的元素個數);
list($a,$b,$c)=[1,2,3];-->$a=1,$b=2,$c=3
註意:① list()在解析數組時,只解析索引數組;
② list可以通過空參數,選擇性的解析數組的值
list($a,,$b)=[1,2,3];-->$a=1;$b=3;
each():用於返回數組當前指針所在位的鍵值對!並將指針後移一位;
返回值:如果指針有下一位,返回一個數組。包含一個索引數組(0-鍵,1-值),和一個關聯數組("key"-鍵,"value"-值);
如果指針沒有下一位,返回false
[使用list()/each()/while()配合遍歷數組]
while(list($key,$value) = each($arr)){ echo "{$key}-->{$value}<br>"; } reset($arr);
!!!數組使用each()遍歷完一遍後,指針使用處於最後一位的下一位;即再用each(),始終返回false。
如果還需使用,需用reset($arr)函數,重置數組指針;
使用數組指針遍歷數組
① next:將數組指針,向後移一位,並返回後一位的值,若後一位沒有,返回false
② prev:將數組指針,向前移一位,並返回前一位的值,若前一位沒有,返回false
③ end:將數組指針,移至最後一位,並返回最後一位的值,空數組返回false
④ reset:將數組指針,恢復到第一位,並返回第一位的值,空數組返回false
⑤ key:返回當前指針所在位的鍵
⑥ current:返回當前指針所在位的值
while(true){ echo key($arr); echo "--"; echo current($arr); echo "<br>"; if(!next($arr)){ break; } }
do{ echo key($arr); echo "--"; echo current($arr); echo "<br>"; }while(next($arr));
三、數組的函數
返回數組所有的值,返回數組
$arr=array(1,1,3,4,5,6,"a"=>7,"b"=>8,"c"=>9,10); var_dump(array_values($arr));
返回數組所有的鍵,返回數組
var_dump(array_keys($arr));
檢測數組中是否包含某個值,返回真假 (需要查詢的值,數組,true(===)/false(==)) 默認false
var_dump(in_array(8, $arr,true)); //true 區分類型,false不區分
交換數組中的鍵和值,返回新數組
var_dump(array_flip($arr));
反轉數組,返回新數組
參數:(需要反轉的數組,true 保留原有索引數組的下標與值的匹配/false 只反轉值,鍵不反轉)
無論true/false,都不會影響關聯數組,關聯數組鍵值永遠是一對
默認false
var_dump(array_reverse($arr,true));
統計數組中的值出現的個數,返回一個新數組
鍵-->原數組的值(去重後的值)
值-->原數組對應的值出現的次數
var_dump(array_count_values($arr));
移除重復的值
var_dump(array_unique($arr));
過濾數組中的值
① 不傳回調函數:過濾掉所有空值 ([],0,"",null,"0",false)
② 傳回調函數:需要給回調函數傳遞一個參數,判斷參數是否符合要求,若符合,return true,反之亦反
默認值為false的,顯示不出來
$arr1=array(1,1,3,4,5,6,0,"", null,"a"=>7,"b"=>8,"c"=>9,10); var_dump(array_filter($arr1,function($num){ if($num>4){ return true; }else{ return false; } }));
通過回調函數,對數組的每一個值進行處理操作
執行時,會給回調函數傳遞兩個參數,分別是數組的value,key,然後可以在回調函數中,對值和鍵進行處理
但是,牽扯到修改值的時候,必須要傳遞地址&!!!!
$fruits=array("d"=>"apple","a"=>"orange","b"=>"banana","c"=>"lemon"); var_dump(array_walk($fruits,function(&$item,$key,$num){ echo "{$key}-->{$item}<br>"; $item.=$key; $item.=$num; },"10")); var_dump($fruits);
將數組的每個值,交由回調函數進行映射處理
array_map():參數一:回調函數;參數二:>=1個數組
有幾個數組,可以給回調函數傳幾個參數,表示每個數組的一個value
可以對value進行處理,處理完後通過return返回,那麽新數組的對應的值就是你return回去的值
【array_map與array_walk的異同】
相同點:都能遍歷數組,通過回調函數,重新處理數組的每一個值
不同點:① walk只能傳一個數組,回調函數接受這個數組的值和鍵, map能傳多個數組,回調函數接受每個數組的值
② walk直接修改原數組,而map不修改原數組,將新數組返回
③ walk可以給回調函數傳遞一個其余參數,map只能傳遞數組的值
④ 處理方式上,walk如果需要改掉原數組的值,需在回調函數中傳遞地址,直接改變變量的值
而map,是通過將新的值,用return返回,即可修改新數組的值
排序
sort -- 對數組排序(升序):可以傳入兩個參數,(數組,1 作為數字 按照數字排序/2 作為字符串 按照ASC碼排序)
rsort -- 對數組逆向排序(降序)
usort -- 使用用戶自定義的比較函數對數組中的值進行排序
usort($arr1,function($a,$b){ return $a-$b; }); var_dump($arr1);
下述三個常用於關聯數組排序,用法同上
asort -- 對數組進行排序並保持索引關系(關聯數組排序)
arsort -- 對數組進行逆向排序並保持索引關系
uasort -- 用戶自定義的比較函數對數組進行排序並保持索引關聯
ksort -- 對數組按照鍵名排序
krsort -- 對數組按照鍵名逆向排序
uksort -- 使用用戶自定義的比較函數對數組中的鍵名進行排序
自然排序:數組0-9;字母a-z,下面兩個函數,都是按照自然排序,且會保留鍵值關聯
natsort -- 用“自然排序”算法對數組排序
natcasesort -- 用“自然排序”算法對數組不區分大小寫字母排序
array_multisort -- 對多個數組或多維數組進行排序
參數一:第一個數組(必選)
之後都是可選參數:SORT_DESC/SORT_ASC(升降序)、SORT_STRING/SORT_NUMBERIC(按照數字還是字符串排序)
再之後,是多個可選數組
排序規則:先排第一個數組,之後的數組,按照與第一個數組對應的關系,逐列移動
如果對多個數組排序,需保持長度一致,否則會警告
$arr1=array(1,2,3,50,7,10,13,20); sort($arr1); var_dump($arr1);
$arr1=array(1,2,7,4,8,9,"haha"); $arr2=array(6,9,"hehe",4,7,3,8); array_multisort($arr1,SORT_DESC,SORT_STRING,$arr2); var_dump($arr1); var_dump($arr2);
array array_slice ( array $array ,int $offset [, int $length = NULL [, bool $preserve_keys = false ]] )
① 數組,必須
② 從第幾位開始截取,必選,負數表示,從右邊數第幾位(按照數組的順序,而不是按照下標)
③ 截取的長度,可選,默認截到最後
④ Boolean類是否保持鍵值關聯,可選。默認,索引重新排序,傳true保持索引關聯
array array_splice ( array &$input , int $offset [, int $length = 0 [, mixed $replacement ]] )
返回值:被刪掉的數組
參數:
① 數組的地址,會修改原地址
② 從第幾位開始刪、替換;
③ 刪除或替換的長度
④ 為空,表示刪除操作;傳入內容,表示替換操作的新值
$arr=array(1,2,3,"one"=>4,"two"=>5,"three"=>6,7,8,9); $arr1=array_splice($arr,4,3); var_dump($arr1); var_dump($arr);
array_combine — 創建一個數組,用一個數組的值作為其鍵名,另一個數組的值作為其值
兩個數組必須保持一致,否則報警告,返回false
$arr1=array(1,2,3,4,5); $arr2=array(6,7,8,9,0); $arr3=array_combine($arr1, $arr2); var_dump($arr3);
array_merge — 合並一個或多個數組
合並多個數組,如果數組中出現相同的關聯鍵值,後面的會被覆蓋
$arr1=array(1,2,3,"a"=>4,5); $arr2=array(6,7,8,"a"=>9,0); $arr3=array_merge($arr1, $arr2); var_dump($arr3);
array_intersect — 計算數組的交集
array array_intersect ( array $array1 , array $array2 [, array $ ... ] )
數組取交集,結果會保留第一個數組的鍵值關聯匹配
$arr1=array(1,2,9,"a"=>4,5); $arr2=array(6,7,8,"a"=>9,5); $arr3=array_intersect($arr1, $arr2); var_dump($arr3);
array_diff — 計算數組的差集
array array_diff ( array $array1 , array $array2 [, array $... ] )
取出多個數組中,在一個數組中包含,而其他數組中不包含的值,保留鍵值關聯
$arr1=array(1,2,9,"a"=>4,5); $arr2=array(6,7,8,"a"=>9,5); $arr3=array_diff($arr1, $arr2); var_dump($arr3);
array_pop() 彈出並返回 array 數組的最後一個單元(值),並將數組 array 的長度減一。
如果 array 為空(或者不是數組)將返回 NULL。 此外如果被調用不是一個數則會產生一個 Warning。
array_push() 數組的最後,放入1-多個值,返回處理之後的元素個數
array_shift() 刪除第一個值,並返回這個值
array_unshift() 數組的開頭,放入1-多個值,返回處理之後的元素個數
$arr1=array(1,2,9,"a"=>4,5); $arr3=array_unshift($arr1,8); var_dump($arr3);
PHP中的數組