關聯數組(鍵值對集合)是 PHP 中最常用的數據結構。本文系統梳理 foreach、array_walk、for 配合 array_keys 等多種遍歷方式,並對比性能與適用場景,助你寫出更優雅、高效的代碼。
<?php
$age = [
'zhangshan' => 14,
'lisi' => 15,
'sharejs' => 16,
];
// 最常用:同時獲取鍵和值
foreach ($age as $name => $value) {
echo "$name = $value\n";
}
// 僅需值
foreach ($age as $value) {
echo "Age: $value\n";
}
// 僅需鍵
foreach ($age as $name => $_) {
echo "User: $name\n";
}
?>
<?php
foreach ($age as $name => &$value) {
$value += 1; // 生日增長
}
unset($value); // 打破引用,避免後續誤用
print_r($age);
?>
<?php
$users = [
['name' => 'Alice', 'age' => 25],
['name' => 'Bob', 'age' => 30],
];
foreach ($users as ['name' => $name, 'age' => $age]) {
echo "$name is $age years old\n";
}
?>
<?php
array_walk($age, function ($value, $key) {
echo "$key => $value\n";
});
// 攜帶額外參數
$prefix = 'User: ';
array_walk($age, function ($value, $key) use ($prefix) {
echo "$prefix$key => $value\n";
});
?>
<?php
$upper = array_map(function ($value, $key) {
return strtoupper($key) . '=' . $value;
}, $age, array_keys($age));
print_r($upper);
// Array ( [0] => ZHANGSHAN=14 [1] => LISI=15 [2] => SHAREJS=16 )
?>
| 方法 | 耗時 (ms) | 內存增長 | 推薦場景 |
|---|---|---|---|
foreach ($arr as $k => $v) | ~45 | 極小 | 通用首選,可讀性最好 |
foreach ($arr as &$v) | ~48 | 極小 | 需原地修改值 |
array_walk($arr, $fn) | ~65 | 微增 | 需復用回調、攜帶上下文 |
array_map($fn, $arr, array_keys($arr)) | ~90 | 生成新數組 | 函數式轉換、鏈式調用 |
for ($i=0; $i | ~120 | 額外 keys 數組 | 極少見,僅特殊索引邏輯 |
測試環境:PHP 8.2,1,000,000 元素關聯數組,僅遍歷輸出字符串拼接。實際業務邏輯差異可能影響排名,但 foreach 始終是性能與可讀性的最佳平衡點。
$v 不影響原數組,需用 &$v 引用。$v 仍引用最後一個元素,必須 unset($v)。foreach 內部使用數組副本,新增元素不會被遍歷到,刪除當前元素安全,刪除其他元素可能導致指針錯亂。$arr['01'] 和 $arr[1] 是不同鍵,遍歷時保持原樣。foreach ($arr as $k => $v),清晰、快速、語義明確。foreach ($arr as $k => &$v) + unset($v)。array_map / array_filter / array_reduce。array_walk。for + array_keys 除非有極特殊索引需求。