首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 關聯數組遍歷完全指南:foreach、array_walk、鍵值解構與性能對比

     編輯:PHP 綜合知識

前言

關聯數組(鍵值對集合)是 PHP 中最常用的數據結構。本文系統梳理 foreach、array_walk、for 配合 array_keys 等多種遍歷方式,並對比性能與適用場景,助你寫出更優雅、高效的代碼。

基礎語法:foreach 鍵值解構

<?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";
}
?>

進階技巧

1. 引用修改原數組值

<?php
foreach ($age as $name => &$value) {
    $value += 1; // 生日增長
}
unset($value); // 打破引用,避免後續誤用
print_r($age);
?>

2. 解構嵌套數組(PHP 7.1+)

<?php
$users = [
    ['name' => 'Alice', 'age' => 25],
    ['name' => 'Bob',   'age' => 30],
];

foreach ($users as ['name' => $name, 'age' => $age]) {
    echo "$name is $age years old\n";
}
?>

3. array_walk:回調風格遍歷

<?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";
});
?>

4. array_map:轉換並生成新數組

<?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 + array_keys~120額外 keys 數組極少見,僅特殊索引邏輯

測試環境:PHP 8.2,1,000,000 元素關聯數組,僅遍歷輸出字符串拼接。實際業務邏輯差異可能影響排名,但 foreach 始終是性能與可讀性的最佳平衡點。

常見坑點

  1. foreach 複製行為:默認按值複製,修改 $v 不影響原數組,需用 &$v 引用。
  2. 引用殘留:循環結束後 $v 仍引用最後一個元素,必須 unset($v)。
  3. 遍歷中增刪元素:foreach 內部使用數組副本,新增元素不會被遍歷到,刪除當前元素安全,刪除其他元素可能導致指針錯亂。
  4. 字符串鍵的數字轉換:$arr['01'] 和 $arr[1] 是不同鍵,遍歷時保持原樣。

總結建議

  • ✅ 90% 場景直接用 foreach ($arr as $k => $v),清晰、快速、語義明確。
  • ✅ 需原地修改值 → foreach ($arr as $k => &$v) + unset($v)。
  • ✅ 函數式風格/鏈式轉換 → array_map / array_filter / array_reduce。
  • ✅ 復用邏輯/攜帶上下文 → array_walk。
  • ❌ 避免 for + array_keys 除非有極特殊索引需求。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved