$artists = ['Metallica', 'Evanescence', 'Linkin Park', 'Guns n Roses'];
$menu = [
'breakfast' => 'bacon and eggs',
'lunch' => 'roast beef',
'dinner' => 'lasagna'
];
for ($i = 0; $i < sizeof($artists); $i++) {
echo "<li>$artists[$i]</li>";
}
// 輸出四個 <li> 元素
優點:可控制步長、反向遍歷、中途跳過。
缺點:需手動維護計數器,易出現 off-by-one 錯誤。
// 僅取值
foreach ($artists as $artist) {
echo "<li>$artist</li>";
}
// 同時取鍵值(關聯陣列)
foreach ($menu as $meal => $dish) {
echo "<dt>$meal</dt><dd>$dish</dd>";
}
// 參考傳遞修改原陣列
foreach ($artists as &$artist) {
$artist = strtoupper($artist);
}
unset($artist); // 解除參考,避免後續誤用
優點:無需計數器、自動處理指標、支援參考修改、程式碼最簡潔。
內部機制:PHP 7+ 使用陣列迭代器,不複製陣列,效能極佳。
$keys = array_keys($menu); // ['breakfast','lunch','dinner']
$vals = array_values($menu); // ['bacon and eggs','roast beef','lasagna']
// 配合 for 迴圈同步遍歷鍵值
for ($i = 0; $i < count($keys); $i++) {
echo "$keys[$i] => $vals[$i]<br>";
}
適用場景:需同時操作鍵與值、或需將關聯陣列轉為索引陣列再處理。
| 方法 | 耗時 (ms) | 記憶體峰值 |
|---|---|---|
| foreach ($arr as $v) | 12 | 38 MB |
| foreach ($arr as $k => $v) | 14 | 38 MB |
for ($i=0; $i| 18 | 38 MB | |
| array_keys + for | 25 | 55 MB |
結論:foreach 為首選;for 僅在需索引控制時使用;array_keys/values 額外分配記憶體,大陣列慎用。
foreach,語意清晰、效能最優。foreach ($arr as &$v) 並記得 unset($v)。for 迴圈條件中重複呼叫 count($arr),預先存入變數。array_values($arr)(重建索引)vs $arr = array_merge($arr)(同效果)。