1. 連續索引陣列:for 迴圈
$subject = ['maths', 'english', 'physics'];
$count = count($subject);
for ($i = 0; $i < $count; ++$i) {
echo $subject[$i] . "\n";
}
// 索引不從 0 開始時
$subject = [3 => 'maths', 'english', 'physics'];
$count = count($subject) + 3;
for ($i = 3; $i < $count; ++$i) {
echo $subject[$i] . "\n";
}
2. 關聯陣列:foreach(推薦)
$subject = ['m' => 'maths', 'e' => 'english', 'p' => 'physics'];
foreach ($subject as $key => $value) {
echo "$key is $value\n";
}
3. list() + each() 經典寫法
reset($subject); // 重置指標
while (list($key, $value) = each($subject)) {
echo "$key is $value\n";
}
4. array_walk() 回調處理
$subject = ['maths', 'english', 'physics'];
function printElement($element) {
echo $element . "\n";
}
array_walk($subject, 'printElement');
// PHP 5.3+ 匿名函式
array_walk($subject, function($v) { echo $v . "\n"; });
效能與行為差異總結
| 方法 | 複製陣列 | 影響內部指標 | 適用場景 |
| foreach | 是(淺拷貝) | 否 | 通用、唯讀遍歷、鍵值同時需要 |
| list/each | 否 | 是(指標移至末尾) | 需操作指標、舊代碼維護 |
| array_walk | 否 | 否 | 需自訂處理邏輯、就地修改值(傳參考 &$v) |
| for | 否 | 否 | 連續索引、需控制步長/逆序 |
最佳實踐建議
- 優先使用
foreach:語意清晰、效能佳、不干擾指標 - 需修改原陣列值:
foreach ($arr as &$v) { $v = ...; } unset($v); - 大型陣列考慮 Generator (
yield) 分批處理