萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> PHP 程式設計

PHP 陣列遍歷四大核心方法:foreach、list、each、for 完整對比指南

PHP 陣列遍歷核心技術全景

陣列遍歷是 PHP 資料處理的高頻操作。本文系統對比 foreach、list/each、for 四大遍歷方案的語法特性、適用場景與效能差異,助你根據資料結構選擇最優方案。

foreach:現代 PHP 遍歷首選

雙重語法形態

僅取值模式:

foreach (array_expression as $value) {
    statement;
}

鍵值對模式:

foreach (array_expression as $key => $value) {
    statement;
}

關鍵特性

  • 自動處理內部指標,無需手動重置
  • 支援關聯陣列與索引陣列統一遍歷
  • PHP 7+ 為值複製語義,修改 $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>";
}
?>

each() + list():經典指標遍歷組合(PHP 7.2 棄用,8.0 移除)

each() 函數機制

返回當前指標位置的鍵值對陣列,並將指標前移:

$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(值)四個鍵。

list() 解構賦值

將 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。

for 循環遍歷:索引陣列的底層控制

適用場景

  • 純數字索引陣列(0,1,2...連續)
  • 需精確控制索引範圍(如反向遍歷、步長控制)
  • 高效能場景避免 foreach 複製開銷(極少數情況)

標準範例

<?php
$a[] = "張學友";
$a[] = "劉德華";
$a[] = "黎明";
$a[] = "郭富城";
$s = count($a);  // 4

for ($i = 0; $i < $s; $i++) {
    echo $a[$i] . "<br>";
}
?>

四大方案深度對比

維度foreacheach+listfor
PHP 版本支援全版本 ✅7.2⚠️ 8.0❌全版本 ✅
關聯陣列支援原生完美支援但繁瑣需配合 array_keys()
索引陣列效能優(值複製有微小開銷)較差(函數調用開銷)極優(直接索引訪問)
代碼可讀性⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
指標副作用不影響內部指標移動內部指標無指標概念
修改原陣列需用 &$value 引用直接修改直接修改 $arr[$i]

現代最佳實踐建議

  1. 首選 foreach:95% 場景的最佳選擇,語義清晰、效能優異、維護容易
  2. 避免 each()/list():歷史遺留代碼需重構,新代碼禁用
  3. for 保留場景:
    • 反向遍歷:for ($i = count($arr)-1; $i >= 0; $i--)
    • 步長控制:for ($i = 0; $i < $len; $i += 2)
    • 多陣列同步遍歷:for ($i=0; $i
  4. 引用修改陣列值:
    foreach ($arr as &$val) {
        $val = strtoupper($val);  // 修改原陣列
    }
    unset($val);  // 釋放引用,防止後續誤用
  5. Generator 替代大陣列遍歷:處理百萬級資料時用 yield 避免記憶體爆炸

總結

PHP 陣列遍歷已進入 foreach 獨大時代。理解 each()/list() 歷史機制有助於維護舊代碼,但新專案應堅持使用 foreach,配合引用修改、Generator 等進階特性,編寫現代、高效、可維護的遍歷代碼。

copyright © 萬盛學電腦網 all rights reserved