PHP遍歷陣列

2020-07-16 10:05:12
PHP 程式設計中常用 for、foreach、each()、list() 對陣列進行遍歷。

for 迴圈遍歷陣列

使用 for 迴圈遍歷陣列的一個例子如下:
<?php
$fruits = array("lemon", "orange", "banana", "apple");
for ($i=0; $i < count($fruits); $i++) {
    echo current($fruits) . " ";
    echo $fruits[$i] . "<br/>";
}?>
以上程式的執行結果如下:

lemon lemon
lemon orange
lemon banana
lemon apple

從結果可知,這種使用 for 迴圈遍歷陣列的形式沒有改變陣列的內部指標。

foreach 遍歷陣列

範例如下:
<?php
$array = [0, 1, 2];
foreach ($array as &$val){  // 遍歷陣列
    echo $val;  
}
?>
執行以上程式的輸出結果為:

012

再給出一個範例:
<?php
$array = [0, 1, 2];
foreach ($array as &$val){
    var_dump(current($array));  // 遍歷陣列, 使用current()輸出陣列指標指向的當前單元的值
}
?>
在 PHP 7 中執行以上程式的輸出結果為:

int(0) int(0) int(0)

說明 PHP 7 沒有改變陣列內部的指標。

而在 PHP 7 之前的版本中則會輸出:

int(1) int(2) bool(false)

說明 PHP 7 之前的版本在進行 foreach 迴圈時會改變陣列內部的指標。

在使用 foreach 迴圈遍歷陣列的時候,foreach 是對陣列的備份進行操作,在迴圈內部修改陣列不會對迴圈之外存取陣列有影響。範例如下:
<?php
$arr = array(0, 1, 2);
foreach ($arr as $val){
    $val = $val*2;  // 元素值乘以2
}
print_r($arr);
?>
執行程式,輸出結果是:

Array
(
    [0] => 0
    [1] => 1
    [2] => 2
)

如果是按照參照迴圈,那麼在迴圈內部對陣列做的修改會影響陣列本身。範例如下:
<?php
$arr = array(0, 1, 2);
foreach ($arr as &$val){
    $val = $val*2;  // 元素值乘以2
}
print_r($arr);
?>
執行以上程式的結果為:

Array
(
    [0] => 0
    [1] => 2
    [2] => 4
)

each() 和 list() 函數

each() 函數返回陣列中當前的鍵值並將陣列指標向前移動。在執行 each() 之後,陣列指標將停留在陣列中的下一個元素或者當碰到陣列結尾時停留在最後一個元素。如果要再用 each 遍歷陣列,就必須使用 reset()。

each() 的使用範例如下:
<?php
$info = array("C語言中文網", "PHP教學", "http://c.biancheng.net/php/", "8年", "嚴長生");

$val1 = each($info);  //指標向後移動一步
print_r($val1);
echo current($info) . "n";  //當前指標指向值

$val2 = each($info);
print_r($val2);
echo current($info) . "n";
?>
執行以上程式的結果如下:

Array
(
    [1] => C語言中文網
    [value] => C語言中文網
    [0] => 0
    [key] => 0
)
PHP教學
Array
(
    [1] => PHP教學
    [value] => PHP教學
    [0] => 1
    [key] => 1
)
http://c.biancheng.net/php/


each() 函數和 list() 函數結合可以遍歷陣列,範例如下:
<?php
$info = array(
    "website" => "C語言中文網",
    "course" => "PHP教學",
    "url" => "http://c.biancheng.net/php/",
    "age" => "8年",
    "author" => "嚴長生"
);
while( list($key, $val) = each($info) ) {
    echo "$key => $valn";
}
?>
執行以上程式的結果為:

website => C語言中文網
course => PHP教學
url => http://c.biancheng.net/php/
age => 8年
author => 嚴長生


也可以使用 list() 將陣列的值分別賦給變數,範例如下:
<?php
$info = array("C語言中文網", "PHP教學", "http://c.biancheng.net/php/", "8年", "嚴長生");
list($website, $course, $url, $age, $author) = $info;
echo $website . "n" . $course . "n" . $url . "n" . $age . "n" . $author;
?>
執行以上程式的輸出結果為:

C語言中文網
PHP教學
http://c.biancheng.net/php/
8年
嚴長生


注意以下例子:
<?php
$info = array("C語言中文網", "PHP教學", "http://c.biancheng.net/php/", "8年", "嚴長生");
list($arr[0], $arr[1], $arr[2]) = $info;
print_r($arr);
?>
在 PHP 5 中的輸出結果是:

Array
(
    [2] => http://c.biancheng.net/php/
    [1] => PHP教學
    [0] => C語言中文網
)

在 PHP 7 中執行以上程式,輸出結果為:

Array
(
    [0] => C語言中文網
    [1] => PHP教學
    [2] => http://c.biancheng.net/php/
)

PHP 7 改變了 list() 賦值的順序,由原來的倒序賦值改成了正序賦值。