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

PHP array_walk() 深度解析:遍歷修改數組、傳遞額外參數、遞歸處理

     編輯:PHP 綜合知識

array_walk() 是 PHP 遍歷並**原地修改**數組的核心函數,支援傳遞用戶數據、遞歸處理多維數組。本文詳細講解語法、參數陷阱、常見模式與性能對比。

函數簽名

array_walk(array &$array, callable $callback, mixed $arg = null): bool
  • &$array:引用傳遞,**回調函數修改 $value 會直接改變原數組**。
  • $callback:fn(&$value, $key, $arg) { ... },第一參數必須按引用 &$value 才能修改原數組。
  • $arg:額外參數,將原樣傳給回調第三參數。
  • 返回 true,失敗拋警告。

基礎示例:修改數組元素、使用額外參數

$fruits = ['apple', 'banana', 'orange'];

array_walk($fruits, function(&$item, $key, $prefix) {
    $item = $prefix . $item;
}, 'Fruit: ');

print_r($fruits);
/*
Array
(
    [0] => Fruit: apple
    [1] => Fruit: banana
    [2] => Fruit: orange
)
*/

遞歸處理多維數組

function walkRecursive(array &$array, callable $callback, $arg = null) {
    array_walk($array, function(&$value, $key) use (&$walkRecursive, $callback, $arg) {
        if (is_array($value)) {
            $walkRecursive($value, $callback, $arg);
        } else {
            $callback($value, $key, $arg);
        }
    });
}

$data = [
    'user' => ['name' => 'Alice', 'tags' => ['php', 'laravel']],
    'settings' => ['theme' => 'dark', 'lang' => 'en']
];

walkRecursive($data, function(&$v, $k) {
    if (is_string($v)) $v = strtoupper($v);
});

print_r($data);
// 所有字符串值變大寫,鍵名不變

常見陷阱與避坑

錯誤代碼問題正確寫法
array_walk($arr, fn($v) => $v = strtoupper($v));$v 非引用,修改無效fn(&$v) => $v = strtoupper($v)
array_walk($arr, 'strtoupper');strtoupper 不接受引用參數,報警告用 array_map('strtoupper', $arr) 返回新數組
回調中 unset($value)僅銷毀局部變量,原數組元素不變回調返回 false 可停止遍歷,需刪除用 array_walk 配合 unset($array[$key]) 在外部
修改鍵名array_walk 無法修改鍵名用 array_combine(array_map(...), $arr) 或 foreach 重建

array_walk vs array_map vs foreach

特性array_walkarray_mapforeach
修改原數組✅ (引用)❌ (返回新)✅
返回值bool新數組無
多數組並行遍歷❌✅手動實現
傳遞額外參數✅ ($arg)❌ (用 use/箭頭函數)直接用外部變量
可中斷遍歷回調返回 false❌break
性能略快於 foreach中等最快(無函數調用開銷)

實戰模式:數組清洗/標準化

function sanitizeArray(array &$data, array $rules) {
    array_walk($data, function(&$value, $key) use ($rules) {
        if (isset($rules[$key])) {
            $rule = $rules[$key];
            // 修剪
            if ($rule['trim'] ?? false) $value = trim($value);
            // 類型轉換
            if (isset($rule['type'])) {
                settype($value, $rule['type']);
            }
            // 回調處理
            if (isset($rule['callback']) && is_callable($rule['callback'])) {
                $value = $rule['callback']($value);
            }
        }
    });
}

$input = ['  name  ' => '  Alice  ', 'age' => '25', 'email' => 'ALICE@EXAMPLE.COM'];
sanitizeArray($input, [
    'name'  => ['trim' => true],
    'age'   => ['type' => 'integer'],
    'email' => ['trim' => true, 'callback' => 'strtolower'],
]);
print_r($input);
// ['name'=>'Alice', 'age'=>25, 'email'=>'alice@example.com']

總結

  • 需原地修改、傳遞額外參數、可中斷 → array_walk。
  • 需返回新數組、多數組並行、鍵值轉換 → array_map。
  • 複雜邏輯、需 break/continue、修改鍵名、性能極致 → foreach。

掌握 array_walk 的引用機制與遞歸模式,能優雅處理多維數組清洗、標準化、批量轉換等高頻任務。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved