數組是 PHP 最核心的數據結構,高效遍歷是基本功。本文對比 for、foreach 及進階技巧,助你寫出優雅高效的循環代碼。
for 循環$artists = ['Metallica', 'Evanescence', 'Linkin Park', 'Guns n Roses'];
for ($i = 0; $i < count($artists); $i++) {
echo "<li>{$artists[$i]}</li>";
}
優化點:count() 提前緩存 $len = count($artists),避免每次迭代調用函數。
$menu = [
'breakfast' => 'bacon and eggs',
'lunch' => 'roast beef',
'dinner' => 'lasagna'
];
$keys = array_keys($menu); // ['breakfast','lunch','dinner']
$values = array_values($menu); // ['bacon and eggs','roast beef','lasagna']
foreach 一站式遍歷$artists = ['Metallica', 'Evanescence', 'Linkin Park', 'Guns n Roses'];
foreach ($artists as $artist) {
echo "<li>$artist</li>";
}
優勢:
count()、自動指針移動。foreach ($menu as $meal => $dish) 同時獲取鍵值。foreach ($data as &$value) {
$value = trim($value); // 原數組被修改
}
unset($value); // 斷開引用,防止後續誤用
實現 Iterator 介面或使用生成器:
function hugeDataGenerator() {
for ($i = 0; $i < 1000000; $i++) yield $i * 2;
}
foreach (hugeDataGenerator() as $val) {
// 僅在需要時計算,內存常數級
}
| 場景 | 推薦方式 | 備註 |
|---|---|---|
| 小型數值索引數組 | foreach | 可讀性最佳,性能差異微乎其微 |
| 需索引操作/逆序/步長 | for | 靈活控制索引 |
| 關聯數組 | foreach ($arr as $k => $v) | 唯一合理選擇 |
| 需修改原值 | foreach (&$v) | 注意 unset 引用 |
| 超大/無限數據集 | Generator/Iterator | 避免一次性載入內存 |
foreach ($arr as $v) { $v = ... } 不加 & 修改的是副本,原數組不變。unset($arr[$k]) 導致指針錯亂,改用 array_filter() 或先收集待刪除鍵再二次處理。選對遍歷方式,代碼既快又美。