標籤:修改 順序 更改 執行 引用 結構 遍曆數組 name hang
foreach 文法結構用於遍曆數組。
foreach()
PHP foreach() 文法結構用於遍曆操作或輸出數組,foreach() 僅能用於遍曆數組或對象,當試圖將其用於其它資料類型或者一個未初始化的變數時會產生錯誤。
文法:
foreach (array as $value) statement// 或者:foreach (array as $key => $value) statement
上述文法中,每次迴圈將當前單元的值賦給 $value 並且數組內部的指標向前移一步。在第二種文法格式中還將當前單元的鍵名也會在每次迴圈中賦給變數 $key。
例子:
<?php$arr_age = array("wang"=>18, "li"=>20, "zhang"=>25);foreach ($arr_age as $age) { echo $age,‘<br />‘;}?>
運行該例子輸出:
182025
使用數組索引值
<?php$arr_age = array("wang"=>18, "li"=>20, "zhang"=>25);foreach ($arr_age as $key=>$age) { echo $key,‘: ‘,$age,‘<br />‘;}?>
運行例子輸出:
wang: 18li: 20zhang: 25
提示
當 foreach 開始執行時,數組內部的指標會自動指向第一個單元,這意味著不需要在 foreach 迴圈之前調用 reset()。
foreach 所操作的是指定數組的一個拷貝,而不是該數組本身。對返回的數組單元的修改也不會影響原數組(見下面例子),但 foreach 迴圈運行到結束,原數組的內部指標將指向數組的結尾。
<?php$arr_age = array("wang"=>18, "li"=>20, "zhang"=>25);foreach ($arr_age as $age) { $age = $age+10; echo $age,‘<br />‘;}// 輸出原數組print_r($arr_age);?>
運行例子輸出:
283035Array ( [wang] => 18 [li] => 20 [zhang] => 25 )
要在 foreach 中修改原數組元素,可以通過引用來實現,將上面的例子更改為:
<?php$arr_age = array("wang"=>18, "li"=>20, "zhang"=>25);foreach ($arr_age as &$age) { $age = $age+10; echo $age,‘<br />‘;}// 輸出原數組print_r($arr_age);?>
運行例子輸出:
182025Array ( [wang] => 28 [li] => 30 [zhang] => 35 )
遍曆多維陣列
foreach 文法結構只能用於遍曆一維數組,要遍曆多維陣列,一般是將 foreach 嵌套遞迴使用或者將原數組分割為一維數組再進行 foreach 遍曆。
一二維數組混合的例子:
$arr_age = array("wang"=>18, "li"=>20, "zhang"=>array("name"=>"小張", "age"=>25));foreach ($arr_age as $age) { if(is_array($age)){ foreach ( $age as $detail) { echo $detail,‘<br />‘; } } else { echo $age,‘<br />‘; }}?>
運行該例子輸出:
1820小張25
對多維陣列的遍曆處理就要根據實際的資料結構而採取最合適的處理方式。
延伸預讀
PHP 數組是通過雜湊表(HashTable)表實現的,因此 foreach 遍曆數組時是依據元素添加的先後順序來進行的。如果想按照索引大小遍曆,應該使用 for() 迴圈遍曆。
for() 迴圈遍曆數組
如果是操作連續索引值的數組,也可以採用 for() 迴圈來遍曆數組:
<?php$arr_age = array(18, 20, 25);$num = count($arr_age);for($i = 0; $i < $num; $i++){ echo $arr_age[$i]."<br />";}?>
運行例子輸出如下:
182025
提示
也可以用 list() 和 each() 結合來遍曆數組,但測試發現效率不如 foreach() 。
PHP 數組遍曆 foreach 文法結構