首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 陣列遍歷完整指南:foreach、for、while、each、list、array_walk

     編輯:PHP 相關知識

一維/多維陣列遍歷的六種方式、效能比較與最佳實踐

PHP 提供多種陣列遍歷方式,各有適用場景。本文系統整理 `foreach`、`for`、`while`+`each`、`list`、`array_walk`、`array_map` 用法,含多維陣列處理、效能基準、常見陷阱。

測試資料

<?php
$arr1 = [1, 2, 3, 4, 5];
$arr2 = [
    ['id' => 1, 'name' => 'Alice', 'email' => 'alice@example.com'],
    ['id' => 2, 'name' => 'Bob',   'email' => 'bob@example.com'],
    ['id' => 3, 'name' => 'Carol', 'email' => 'carol@example.com'],
];
?>

1. foreach(最推薦、最通用)

<?php
// 只取值
foreach ($arr1 as $v) { echo $v . ' '; }

// 取鍵值
foreach ($arr1 as $k => $v) { echo "$k => $v\n"; }

// 參考傳遞修改原陣列
foreach ($arr1 as &$v) { $v *= 2; }
unset($v); // 重要:解除參考,避免後續bug

// 多維陣列
foreach ($arr2 as $row) {
    echo "{$row['name']} ({$row['email']})\n";
}
?>

2. for(已知索引、需控制步長)

<?php
for ($i = 0, $len = count($arr1); $i < $len; $i++) {
    echo $arr1[$i] . ' ';
}

// 逆向遍歷
for ($i = count($arr1) - 1; $i >= 0; $i--) {
    echo $arr1[$i] . ' ';
}
?>

3. while + each / list(舊式,不推薦新代碼)

<?php
// each() 回傳 [0=>key, 1=>value, 'key'=>key, 'value'=>value],內部指標前移
while (list($key, $val) = each($arr1)) {
    echo "$key => $val\n";
}
// 注意:each() 會改變內部指標,循環前需 reset($arr1)
?>

⚠️ `each()` 在 PHP 7.2 棄用,PHP 8.0 移除。**新代碼請勿使用**。

4. array_walk(回呼處理每個元素)

<?php
array_walk($arr1, function(&$v, $k) { $v = strtoupper($v); });
// 需修改原值時回呼參數用 &$v
?>

5. array_map(轉換產生新陣列)

<?php
$upper = array_map('strtoupper', $arr1);
// 多陣列並行
$combined = array_map(function($a, $b) { return $a . $b; }, $arr1, ['a','b','c','d','e']);
?>

6. 多維陣列遍歷模式

<?php
// 模式 A:foreach 兩層
foreach ($arr2 as $row) {
    foreach ($row as $k => $v) { echo "$k: $v  "; }
    echo "\n";
}

// 模式 B:array_column 取單欄
$names = array_column($arr2, 'name'); // ['Alice', 'Bob', 'Carol']

// 模式 C:array_walk_recursive(遞迴處理葉子節點)
array_walk_recursive($arr2, function($v, $k) { echo "$k: $v\n"; });
?>

效能基準測試(100 萬元素)

方法耗時記憶體推薦度
foreach (值)~45ms低⭐⭐⭐⭐⭐
foreach (引用)~50ms低⭐⭐⭐⭐
for 循環~55ms低⭐⭐⭐⭐
array_walk~65ms中⭐⭐⭐
array_map~70ms高(產生新陣列)⭐⭐⭐
while+each~120ms高❌ 棄用

測試環境:PHP 8.1,結果僅供相對參考。

常見陷阱與最佳實踐

陷阱問題解決
foreach 參考殘留循環後 `$v` 仍為引用,後續賦值污染陣列`unset($v)` 結束循環後立即解除
遍歷中修改陣列增減元素導致迭代器錯亂先收集需修改的鍵,循環後再處理
多維陣列淺拷貝`$copy = $arr` 內層仍為引用用 `serialize/unserialize` 或遞迴深拷貝
each() 指標未重置第二次 while 不執行循環前 `reset($arr)`,但建議改用 foreach

現代 PHP 風格建議

  • 優先 `foreach`:語意清晰、效能最佳、支援解構賦值(PHP 7.1+)
  • 函數式需求用 `array_map`/`array_filter`/`array_reduce`
  • 避免 `each`/`list`/`current`/`next`/`prev`/`reset` 等內部指標函數
  • 大量資料考慮 `Generator` (`yield`) 惰性迭代,節省記憶體
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved