萬盛學電腦網

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

PHP foreach 迴圈完整指南:遍歷陣列與物件的標準做法

foreach 核心語法

foreach (iterable $array as $value) { ... }
foreach (iterable $array as $key => $value) { ... }
  • 適用於陣列與實作 Traversable 介面的物件(如 Iterator、Generator)。
  • 預設複製值(值傳遞),修改 $value 不影響原陣列。
  • 若需修改原陣列值,使用參考傳遞:foreach ($arr as &$value),結束後建議 unset($value) 解除參考。

實戰範例

關聯陣列遍歷

<?php
$employeeAges = [
    "Lisa"  => 28,
    "Jack"  => 16,
    "Ryan"  => 35,
    "Rachel"=> 46,
    "Grace" => 34,
];

foreach ($employeeAges as $name => $age) {
    echo "Name: $name, Age: $age
"; } /* Name: Lisa, Age: 28 Name: Jack, Age: 16 Name: Ryan, Age: 35 Name: Rachel, Age: 46 Name: Grace, Age: 34 */ ?>

修改原陣列值(參考傳遞)

<?php
$nums = [1, 2, 3];
foreach ($nums as &$n) {
    $n *= 2;
}
unset($n);  // 重要:解除參考,避免後續誤用
print_r($nums);  // [2, 4, 6]
?>

遍歷物件屬性

<?php
class User {
    public $name = "Alice";
    protected $email = "alice@example.com";
    private $id = 1;
}
$user = new User();
foreach ($user as $key => $val) {
    echo "$key => $val\n";  // 僅輸出 public 屬性:name => Alice
}
?>

進階用法

Generator 產生器(記憶體高效)

<?php
function generateNumbers($max) {
    for ($i = 0; $i < $max; $i++) {
        yield $i;
    }
}

foreach (generateNumbers(1000000) as $n) {
    // 僅在需要時產生值,不佔用大量記憶體
    if ($n > 5) break;
    echo $n;
}
?>

多維陣列巢狀遍歷

<?php
$matrix = [
    [1, 2, 3],
    [4, 5, 6],
];
foreach ($matrix as $rowIndex => $row) {
    foreach ($row as $colIndex => $value) {
        echo "[$rowIndex][$colIndex] = $value\n";
    }
}
?>

foreach vs for vs while

迴圈適用場景特性
foreach遍歷陣列/可迭代物件語法簡潔、自動處理鍵值、支援參考修改
for已知次數、需索引運算完全控制初始/條件/遞增
while未知次數、條件驅動前置判斷,可能零次執行
do-while至少執行一次後置判斷

常見錯誤與最佳實踐

  • 忘記 unset 參考:foreach ($arr as &$v) ... 後必須 unset($v),否則後續迴圈 $v 仍參考最後一個元素。
  • 迴圈中修改陣列結構(增刪元素)會導致行為不可預期,應先收集待處理鍵名,迴圈外再操作。
  • 大量資料:優先使用 Generator 或資料庫游標分批處理,避免一次載入所有資料到記憶體。
  • 唯讀遍歷:預設值傳遞即可,無需加 &,效能更好且安全。

PHP 8.1+ 新特性:fiber 與非同步迭代

未來可結合 Fiber 實作非同步 foreach,目前生態系仍以同步為主。

foreach 是 PHP 處理集合資料最核心的工具,熟練掌握其參考傳遞、巢狀遍歷與 Generator 搭配,能寫出高效、可讀的資料處理邏輯。

copyright © 萬盛學電腦網 all rights reserved