陣列遍歷是 PHP 資料處理的高頻操作。本文系統對比 foreach、list/each、for 四大遍歷方案的語法特性、適用場景與效能差異,助你根據資料結構選擇最優方案。
僅取值模式:
foreach (array_expression as $value) {
statement;
}
鍵值對模式:
foreach (array_expression as $key => $value) {
statement;
}
$value 不影響原陣列(需用 &$value 引用修改)<?php
$color = array(
'white' => '白色',
'black' => '黑色',
'red' => '紅色',
'green' => '綠色',
'yellow' => '黃色'
);
// 僅輸出值
foreach ($color as $c) {
echo $c . "<br>";
}
// 輸出鍵值對
foreach ($color as $key => $c) {
echo $key . ':' . $c . "<br>";
}
?>
返回當前指標位置的鍵值對陣列,並將指標前移:
$arr = array(1 => 'php', 5 => 'html', 10 => 'css');
$a = each($arr); // 第一次
echo $a[0] . "\t"; // 鍵名 1
echo $a[1] . "<br>"; // 值 php
$a = each($arr); // 第二次
echo $a['key'] . "\t"; // 鍵名 5
echo $a['value']; // 值 html
返回結構:包含 0/key(鍵名)、1/value(值)四個鍵。
將 each() 返回陣列解構到變數:
<?php
$date = array(1 => 'Monday', 2 => 'Tuesday', 3 => 'Wednesday');
list($key, $value) = each($date); // 遍歷第一個
echo "$key $value<br>"; // 1 Monday
$next = next($date); // 手動移動指標
echo $next; // Tuesday
?>
關係:list() 是 array() 逆操作,將陣列「拆包」到變數。
each() 自 PHP 7.2 棄用,8.0 移除。現代代碼請完全遷移至 foreach。
<?php
$a[] = "張學友";
$a[] = "劉德華";
$a[] = "黎明";
$a[] = "郭富城";
$s = count($a); // 4
for ($i = 0; $i < $s; $i++) {
echo $a[$i] . "<br>";
}
?>
| 維度 | foreach | each+list | for |
|---|---|---|---|
| PHP 版本支援 | 全版本 ✅ | 7.2⚠️ 8.0❌ | 全版本 ✅ |
| 關聯陣列支援 | 原生完美 | 支援但繁瑣 | 需配合 array_keys() |
| 索引陣列效能 | 優(值複製有微小開銷) | 較差(函數調用開銷) | 極優(直接索引訪問) |
| 代碼可讀性 | ⭐⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐ |
| 指標副作用 | 不影響內部指標 | 移動內部指標 | 無指標概念 |
| 修改原陣列 | 需用 &$value 引用 | 直接修改 | 直接修改 $arr[$i] |
for ($i = count($arr)-1; $i >= 0; $i--)for ($i = 0; $i < $len; $i += 2)for ($i=0; $iforeach ($arr as &$val) {
$val = strtoupper($val); // 修改原陣列
}
unset($val); // 釋放引用,防止後續誤用
yield 避免記憶體爆炸PHP 陣列遍歷已進入 foreach 獨大時代。理解 each()/list() 歷史機制有助於維護舊代碼,但新專案應堅持使用 foreach,配合引用修改、Generator 等進階特性,編寫現代、高效、可維護的遍歷代碼。