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);
通过将每个值追加到外部数组,我们创建了一个扁平化的版本。当您需要统一处理所有值时,此技术非常有用。
最佳实践
- 引用参数: 使用 &$value 修改数组元素。
- 键的意识: 当需要条件逻辑时,检查 $key。
- 用户数据: 通过第三个参数传递附加数据。
- 闭包: 使用 'use' 关键字访问外部变量。
- 性能: 避免在大型数组中执行复杂操作。
来源
本教程介绍了 PHP array_walk_recursive 函数,并通过实际示例展示了其在处理嵌套数组结构中的用法。
作者
列出 所有 PHP 数组函数。