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

PHP foreach 遍歷數組完全指南:兩種語法、鍵值獲取、多維數組、引用修改、性能優化

     編輯:PHP 相關知識

PHP foreach 遍歷數組完全指南:兩種語法、鍵值獲取、多維數組、引用修改、性能優化

foreach 是 PHP 遍歷數組/可遍歷對象的專用語法,比 for/while+each 更簡潔、安全。本文系統講解雙語法、鍵值語義、嵌套遍歷、引用陷阱、性能特徵。

兩種基本語法

// 1. 僅獲取值
foreach ($array as $value) {
    // $value 為當前元素值
}

// 2. 同時獲取鍵和值 (推薦)
foreach ($array as $key => $value) {
    // $key 為當前元素鍵 (整數索引或字符串鍵名)
    // $value 為當前元素值
}

核心行為特徵

  • 複製語義:默認按值複製,循環內修改 $value **不影響**原數組。
  • 內部指針:不依賴/不影響 current()/next()/reset() 等內部指針函數。
  • 只能遍歷數組/Traversable:傳入非數組拋出 TypeError (PHP 8+) 或警告。

引用修改原數組

$arr = [1, 2, 3];
foreach ($arr as &$value) { // 加 & 符號
    $value *= 2;
}
unset($value); // **關鍵**:解除引用,防止後續代碼誤修改最後一個元素
print_r($arr); // [2, 4, 6]

最佳實踐:需要修改原數組時使用引用,循環結束**立即 unset($value)**。

多維數組遞歸遍歷

function printTree(array $arr, int $depth = 0) {
    foreach ($arr as $key => $value) {
        echo str_repeat('  ', $depth) . "$key => ";
        if (is_array($value)) {
            echo "\n";
            printTree($value, $depth + 1);
        } else {
            echo "$value\n";
        }
    }
}

$data = [
    'user' => ['name' => 'Zhang', 'age' => 25],
    'roles' => ['admin', 'editor'],
    'active' => true
];
printTree($data);

常見陷阱與避坑

陷阱現象解決
引用殘留循環後 $value 仍引用最後元素,後續賦值污染數組unset($value)
循環中刪除元素unset($arr[$key]) 可能導致跳過下一元素先收集待刪鍵,循環後批量刪除;或反向遍歷
修改鍵名不支援直接修改 $key 影響原數組重建新數組 $new[$newKey] = $value
遍歷對象屬性默認只遍歷可見屬性實現 IteratorAggregate 或 Traversable

性能優化建議

  • 大數組優先 foreach:內部優化優於 for+count() 或 while+each()。
  • 避免在循環內調用昂貴函數:提前計算 $len = count($arr)、$keys = array_keys($arr)。
  • 只需值時別寫 $key =>:微小但可測量的開銷差異。
  • 考慮生成器 yield:惰性產生元素,極大節省記憶體 (如讀取大文件/數據庫結果集)。

對比 for 循環

// 索引數組且需索引運算時 for 更靈活
for ($i = 0, $len = count($arr); $i < $len; $i++) {
    // 可隨意跳過、回退、修改索引
}

// 關聯數組/對象 foreach 唯一選擇

掌握 foreach 細節,寫出更安全、高效、符合 PHP 風格的遍歷代碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved