ZetCode

PHP array_walk_recursive 函数

最后修改于 2025 年 3 月 13 日

PHP array_walk_recursive 函数将用户定义的函数递归地应用于数组的每个元素。它对嵌套数组很有用。

基本定义

array_walk_recursive 递归地处理数组,将回调函数应用于每个非数组元素。它在遍历过程中保留数组键。

语法: array_walk_recursive(array &$array, callable $callback, mixed $userdata = null): bool。回调函数接收值和键参数。

基本 array_walk_recursive 示例

此示例演示如何打印嵌套数组结构中的所有值。

basic_array_walk_recursive.php
<?php

declare(strict_types=1);

$data = [
    'name' => 'John',
    'contacts' => [
        'email' => 'john@example.com',
        'phone' => '123456789'
    ],
    'age' => 30
];

array_walk_recursive($data, function($value, $key) {
    echo "$key: $value\n";
});

回调函数接收每个键值对。嵌套数组被递归处理,但它们的父键不会传递给回调函数。

修改数组值

此示例展示了如何使用引用就地修改数组值。

modify_values.php
<?php

declare(strict_types=1);

$numbers = [
    'a' => 1,
    'b' => [2, 3],
    'c' => 4
];

array_walk_recursive($numbers, function(&$value, $key) {
    $value *= 2;
});

print_r($numbers);

通过按引用传递值 (&$value),我们可以修改原始数组元素。在此示例中,所有数值都被加倍。

使用用户数据参数

第三个参数允许将附加数据传递给回调函数。

user_data.php
<?php

declare(strict_types=1);

$products = [
    'item1' => ['price' => 100, 'quantity' => 2],
    'item2' => ['price' => 200, 'quantity' => 1]
];

$discount = 0.1; // 10% discount

array_walk_recursive($products, function(&$value, $key, $discount) {
    if ($key === 'price') {
        $value *= (1 - $discount);
    }
}, $discount);

print_r($products);

折扣值作为用户数据传递,并且仅应用于价格字段。这演示了基于键和用户数据的选择性修改。

计算数组元素

此示例计算多维数组中的所有非数组元素。

counting_elements.php
<?php

declare(strict_types=1);

$data = [
    'a' => 1,
    'b' => [2, 3, [4, 5]],
    'c' => 6
];

$count = 0;
array_walk_recursive($data, function($value) use (&$count) {
    $count++;
});

echo "Total elements: $count";

使用闭包进行变量绑定,我们为每个非数组元素递增一个计数器。结果显示了叶节点的总数。

构建扁平数组

此示例将嵌套数组中的所有值收集到一个扁平数组中。

flatten_array.php
<?php

declare(strict_types=1);

$nested = [
    'a' => 1,
    'b' => [
        'c' => 2,
        'd' => [3, 4]
    ],
    'e' => 5
];

$flat = [];
array_walk_recursive($nested, function($value) use (&$flat) {
    $flat[] = $value;
});

print_r($flat);

通过将每个值追加到外部数组,我们创建了一个扁平化的版本。当您需要统一处理所有值时,此技术非常有用。

最佳实践

来源

PHP array_walk_recursive 文档

本教程介绍了 PHP array_walk_recursive 函数,并通过实际示例展示了其在处理嵌套数组结构中的用法。

作者

我叫 Jan Bodnar,是一名充满热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。至今,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面拥有超过十年的经验。

列出 所有 PHP 数组函数