1. 程式人生 > >PHP中的數組

PHP中的數組

a-z 遍歷 eve break 通過 off 字面量 鍵值對 ole

一、數組的基礎

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中的數組