php數組的遍歷講解
本文主要講解for,foreach,list,each,key,指針操作相關函數,array_flip ,array_reverse,array_walks等函數的對數組的遍歷
1.for循環遍歷數組
for循環是幾乎所有語言都可以用的一種遍歷數組的方式,但是在php語言中for循環不是遍歷數組的首選
一下是for循環實現數組遍歷的示例代碼
<?php
/*
Designed By Androidyue
php中數組的遍歷講解*/
//for 循環遍歷數組
//聲明一個數組並且初始化
$array=array('Google','Chrome','Android','Youtube','Gmail');
//使用for循環遍歷各數組元素,count()用來計算數組的長度
for($i=0;$i<count($array);$i++){
//打印數組的元素的值
echo $array[$i],"<br>";
}
?>
注意:使用for遍歷數組存在以下限制:
a 所遍歷的數組必須是索引數組(即下標為數字的數組),不能是關聯數組(下標為字符串的數組)
如下列代碼
<?php
$arrGoogle=array('brand'=>'google','email'=>'Gmail','WebBrowser'=>'Chrome','phone'=>'Android');
for($i=1;$i<=count($arrGoogle);$i++){
echo $arrGoogle[$i];
}
?>
在運行時會報錯,類似於這樣的錯誤Notice: Undefined offset: 1 in D:/phpnow/htdocs/holiday/php_array_visit_summary.php on line 13這說明for不適合用於關聯數組的遍歷
b,for遍歷的數組既要滿足是索引數組,同時下標又要是連續的整數,如果不是連續的整數則會發生提示
如下列代碼
<?php
$array=array(1=>'Google',5=>'Chrome',7=>'Android',9=>'Youtube',12=>'Gmail');
//print_r($array);
for($i=0;$i<count($array);$i++){
echo $array[$i],"<br>";
}
?>
這種情況下也會發生提示類似於Notice: Undefined offset: 2 in D:/phpnow/htdocs/holiday/php_array_visit_summary.php on line 10 因此for循環遍歷數組必須是索引數組而且下標必須是連續的。
2.foreach遍歷數組
foreach可以說是php語言單獨為遍歷數組提供的一種方法(其他語言也可能有),這種遍歷方法是php遍歷數組的首選
foreach遍歷時可以是這樣的foreach($array as $key=>$value)包含鍵值元素 也可以是foreach($array as $value)只包含值
foreach($array as $value)示例代碼
<?php
/*
Designed By Androidyue
php中數組的遍歷講解*/
//foreach實現遍歷數組
$arrGoogle=array('brand'=>'google','email'=>'Gmail','WebBrowser'=>'Chrome','phone'=>'Android');
//只包含值
foreach($arrGoogle as $value){
echo $value.'<br>';
}
?>
foreach($array as $key=>$value)的代碼示例
<?php
$arrGoogle=array('brand'=>'google','email'=>'Gmail','WebBrowser'=>'Chrome','phone'=>'Android');
foreach($arrGoogle as $key=>$value){
echo '第',($key+1),'個數組元素的值是',$value,'<br>';
}
?>
注意以上的$value和$key都是自定義的變量,因此可以根據需要更改成符合自己風格的命名方式
3.使用list函數遍歷數組
list()函數是將數組中的值賦給變量
標准語法:void list ( mixed varname, mixed ... )
用list實現對數組的遍歷代碼
<?php
//使用list遍歷函數
//$arrGoogle=array('brand'=>'google','email'=>'Gmail','WebBrowser'=>'Chrome','phone'=>'Android');//使用關聯數組不行
$arrGoogle=array('google','Gmail','Chrome','Android');
list($brand,$email,$webBrowser,$phone)=$arrGoogle;
echo $brand,$email,$webBrowser,$phone;
?>
注意:
a list函數所接受的數組只能是索引數組,不能是關聯數組!如果是關聯數組,則會出現類似 Notice Undefined offset提示
b 如果只是部分取出數組的值,只需 按照這樣的寫法即可,list(,,$chrome,)=$arrGoogle;這樣我們就可以去除chrome的信息,但是注意一定要保證list參數與數組的元素個數相同(所取值前面的個數)
c list函數賦值按索引順序賦值
4.each函數遍歷數組
each函數返回輸入數組的鍵值對
標准語法:array each(array input array)
返回值:返回4個值0,1,key,value;其中0和key包含鍵名,而1和value包含相應的數據
使用each遍歷數組的示例代碼如下:
<?php
//使用each函數遍歷數組
$arrGoogle=array('google','Gmail','Chrome','Android');
//第一次使用each取得當前鍵值對,並且將指針移到下一個位置
$arrG=each($arrGoogle);
//打印結果,並且換行以清晰顯示結果
print_r($arrG);
print '<br>';
$arrGmail=each($arrGoogle);
print_r($arrGmail);
print '<br>';
$arrChrome=each($arrGoogle);
print_r($arrChrome);
print '<br>';
$arrAndroid=each($arrGoogle);
print_r($arrAndroid);
print '<br>';
//當指針位於數組末尾再次執行函數each,如果是這樣再次執行結果返回false
$empty=each($arrGoogle);
//如果指針無法繼續後移返回false
if($empty==false){
print '指針以位於數組末尾,無法在向後移,故返回false';
}
?>
注意:該函數的參數和返回值(在執行該函數前指針不位於數組末尾時)都為數組,在執行函數前數組指針位於數組末尾時再次執行該函數返回值為false
開始的位置是第一個元素,每(正常)執行一次該函數,指針向後移到下一個地址
5.key()遍歷數組
each是用來返回數組的鍵名
基本語法:mixed key ( array &array )
key函數遍歷數組示例代碼如下
<?php
//Designed By Androidyue
//使用key函數遍歷數組
//初始化一個關聯數組
$arrChina=array('a'=>'Hebei','b'=>'Anhui','c'=>'Beijing','d'=>'Guangdong','e'=>'Shanghai');
//初始化一個索引數組 但是索引數組使用key返回的是空字符產
$arrCN=array('Hebei','Anhui','Beijing','Guangdong','Shanghai');//key顯示的是數組的字符串下標,如果為索引數組則為空字符串
//print_r($arrChina);
while($key=key($arrChina)){//對於關聯數組使用key方法可以執行
echo $key,'<br>';
next($arrChina);
}
print_r($arrCN);//輸出一下索引數組
while($keyName=key($arrCN)){//這裡調用key函數賦值後為false,while條件不成立,不進行{}之間的操作
/*if(empty($keyName)){
print '該鍵名為空<br>';
}*/
/*if($keyName=''){
print '該鍵名為空<br>';
}*/
var_dump($keyName);
}
//驗證對索引數組使用key函數的返回值賦值給變量這個表達式的布爾值
if(($KeyName=key($arrCN))==false){
print 'False';
}
//對索引數組調用key函數對變量賦值
$keyName=key($arrCN);
next($arrCN);//將數組指針向後移動一位
next($arrCN);
next($arrCN);
next($arrCN);
next($arrCN);
$keyName=key($arrCN);
var_dump($keyName);//輸出值和類型類型信息
//echo $keyName;
?>
注意:key函數的參數一般為關聯數組,如果為索引數組那麼就沒有什麼意義了
key函數不會推進指針移動,這裡我們調用了next函數,next函數用來推進指針向後移動,下面就是next函數的介紹
6.使用對指針進行操作的函數遍歷數組
a reset函數 用於將指針設置回數組的初始位置,如果需要在一個腳本中多次查看和處理一個數組,就可以使用這個函數,另外這個函數還常用於排序的結束
b.current() 函數
返回當前當前數組指針位置的值,該函數不對指針進行移動操作,需要注意這個特點
c end 將指針移到數組的最後位置,返回目標位置的值
d next 將指針向後移動一次並返回目標位置的數組值,如果當前位置為數組的最後位置,返回false
e prev 將指針向前移動一次,並返回目標位置的數組值,如果當前位置是數組起始位置,則返回false
<?php
//Designed By Androidyue
//reset方法的使用 注意以下代碼調用了控制指針的函數,移動指針的操作會影響到each函數的結果
//初始化一個數組,為了簡寫代碼,聲明一個簡單的數組
$arrGoogle=array('google','Gmail');
//調用each函數,並且輸出返回數組 換行
echo(current($arrGoogle));//使用current函數,打印出當前的值
echo (next($arrGoogle));//調用next函數,打印下一個的值
$arrG=each($arrGoogle);
print_r($arrG);
print '<br>';
$arrGmail=each($arrGoogle);
print_r($arrGmail);
print '<br>';
$arrMore=each($arrGoogle);//當指針無法繼續移動時返回false
//print_r($arrMore);
//echo $arrMore;
print '<br>';
//但是如果想繼續輸出使用重復上面的過程,那麼使用reset函數將指針重置為開始位置,然後重復上面的的操作
reset($arrGoogle);
echo(end($arrGoogle));//調用end函數將指針移到數組最後一個位置,並返回值
echo(prev($arrGoogle));//調用prev函數將指針向前移動,並返回值
$arrG=each($arrGoogle);
print_r($arrG);
print '<br>';
$arrGmail=each($arrGoogle);
print_r($arrGmail);
print '<br>';
?>
7.array_reverse()
該函數是將目標數組元素逆置,如果設置preserver_key為true,則保持原先的映射,否則重置映射
該函數使用示例代碼如下
<?php
$arrGoogle=array('Google','Gmail','Android','Chrome','Youtube');
echo '<pre>';
print '進行操作之前的數組';
print_r($arrGoogle);
$arrReversed=array_reverse($arrGoogle);//不保留先前映射
print '未開啟preserve_key 進行逆序操作後的結果';
print_r($arrReversed);
$arrReversedT=array_reverse($arrGoogle,1);//保留先前映射
print '開啟preserver_key 進行逆序操作的結果';
print_r($arrReversedT);
echo'</pre>';
?>
8.array_flip()
該函數是將數組的鍵和值互換
下面是該函數的使用代碼
<?php
//array_flip()函數的使用
//初始化一個索引數組
$arrGoogle=array('Google','Chrome');
//初始化一個關聯數組
$arrSohu=array('son'=>'Sogou','child'=>'Chinaren','search'=>'Sogou');//如果存在值相同調用array_flip()函數會按照順序將相同的值覆蓋掉,如'son'=>'Sogou'和'search'=>'Sogou'值相同,使用array_flip()函數後,為[Sogou] => search
//對兩個數組調用array_flip()函數進行操作並輸出,都可以正常輸出
print_r(array_flip($arrGoogle));
print '<br>$arrSogou未進行array_flip()函數操作之前的數組';
print_r($arrSohu);
print '<br>$arrSogou未進行array_flip()函數操作之後的數組';
print_r(array_flip($arrSohu));
?>
9.array_walk函數
boolean array_walk(array input_array,callback function[,mixed userdata])
array_walk()函數是將參數數組array_input中的每個元素傳遞給自定義的函數function 中,進行相關的操作,如果想真正修改array_input的鍵值對則需要將每個鍵值對作為引用傳遞給函數
自定義函數必須接受兩個輸入參數,第一個是數組的當前值,第二個是數組的當前鍵,,如果調用array_walk函數給出第三個值userdata,他的第三個值將作為第三個參數傳遞給自定義函數。
<?php
//Designed By Androidyue
//array_walk函數的使用
//初始化一個數組
$arrCorperate=array('移動','聯通','電信');
/*
功能:一個拼接字符串的函數,將數組中的值和用戶輸入的參數(如果無參數輸入拼接默認參數值)
參數:$value(自定義),存放數組中的值,$key存放數組中的鍵,$prefix可選參數,用戶需要通過設置array_walk()的第三個參數給它賦值,如果用戶無賦值,使用默認,或者根據需要取捨
注意:如果用戶使用了引用傳值,那麼數組的值要改變
*/
function linkString(&$value,$key,$prefix='cn'){
$value=$prefix.$value;//函數體實現字符串拼接
}
array_walk($arrCorperate,'linkString');//使用array_walk()對該數組按照自定義函數操作
//array_walk($arrCorperate,'linkString','中國');//這裡傳第三個三處對自定義函數設置參數
print_r($arrCorperate)
?>