<?php
$sports = [
'football' => 'good',
'swimming' => 'very well',
'running' => 'not good'
];
foreach ($sports as $key => $value) {
echo "{$key}: {$value}
";
}
// 輸出:
// football: good
// swimming: very well
// running: not good
?>
優點:語法清晰、支援鍵值同時取得、可配合引用修改原陣列(&$value)、PHP 7+ 效能最佳。
<?php
$sports = ['football' => 'good', 'swimming' => 'very well', 'running' => 'not good'];
// 寫法 A:取得鍵值陣列
while ($elem = each($sports)) {
echo "{$elem['key']}: {$elem['value']}
";
}
// 寫法 B:list() 解構(PHP 7.2+ 棄用,8.0 移除)
while (list($key, $value) = each($sports)) {
echo "{$key}: {$value}
";
}
?>
缺點:each() 內部指標需手動 reset()、不支援 foreach 的引用修改、PHP 8.0 已移除,新專案勿用。
<?php
$keys = array_keys($sports);
for ($i = 0, $len = count($keys); $i < $len; $i++) {
$key = $keys[$i];
$value = $sports[$key];
echo "{$key}: {$value}
";
}
?>
適用場景:需控制迴圈順序、跳過特定索引、或配合 array_slice 分頁處理大陣列。
| 需求 | 寫法 |
|---|---|
| 只取值 | foreach ($arr as $val) |
| 修改原陣列值 | foreach ($arr as &$val) $val = strtoupper($val); |
| 修改鍵名(需重建陣列) | $new = []; foreach ($arr as $k=>$v) $new[strtoupper($k)] = $v; |
| 遞迴遍歷多維關聯陣列 | array_walk_recursive($arr, fn($v,$k)=>...) |
| 檢查鍵是否存在 | isset($arr['key']) 或 array_key_exists('key', $arr) |
// 測試環境:PHP 8.2, 100 萬筆關聯陣列
foreach ($arr as $k=>$v) { ... } // ~45 ms 最快
for ($i=0;$i
最佳實踐建議
- 預設用 foreach:語意明確、效能最好、語法糖最豐富。
- 避免 each()/list():已棄用/移除,舊專案逐步重構。
- 大陣列分批處理:配合
array_chunk 或 Generator 避免記憶體峰值。
- 嚴格型別宣告:PHP 8+ 建議
foreach (array $arr as string $key => mixed $value)。
掌握 foreach 變體與陣列函式組合,應對 99% 遍歷場景綽綽有餘。