一、array_walk_recursive函数概述
array_walk_recursive是PHP中用于对数组或对象中的每个元素应用用户自定义函数的函数,其递归地遍历多维数组或对象,对每个元素执行用户自定义的回调函数。
array_walk_recursive是在原数组上直接操作,只对数组的值进行修改,而不改变键值,它的语法格式如下:
array_walk_recursive (array $array, callable $callback [, mixed $userdata = NULL ] ) : bool
二、array_walk_recursive函数示例
示例一
本示例演示对一个二维数字数组的每个元素执行一次回调函数,该回调函数在每个元素前插入字符串 "Walking index ",代码如下:
<?php $input = array('a', 'b', array('c', 'd')); array_walk_recursive($input, function(&$item, $key) { $item = 'Walking index '.$key.': '.$item; }); print_r($input); ?>
执行结果为:
Array ( [0] => Walking index 0: a [1] => Walking index 1: b [2] => Array ( [0] => Walking index 0: c [1] => Walking index 1: d ) )
示例二
本示例演示使用回调函数逆向处理数组的值,代码如下:
<?php $arr = ["hello", "world", ["foo", "bar", ["hi", "earth"]]]; function reverse_value(&$value, $key) { $value = strrev($value); } array_walk_recursive($arr, 'reverse_value'); print_r($arr); ?>
执行结果为:
Array ( [0] => olleh [1] => dlrow [2] => Array ( [0] => oof [1] => rab [2] => Array ( [0] => ih [1] => htrae ) ) )
示例三
本示例演示传递附加参数给回调函数,代码如下:
<?php $trainers = array( array("name" => "Gary", "pokemon" => array("Squirtle", "Bulbasaur", "Charmander")), array("name" => "Ash", "pokemon" => array("Pikachu", "Squirtle")), array("name" => "Misty", "pokemon" => array("Staryu", "Togepi")) ); function printData(&$item, $key, $separator) { if(is_array($item)) { $item = implode($separator, $item); } echo $key . ' : ' . $item . '<br/>'; } array_walk_recursive($trainers, function(&$item, $key) use($separator) { printData($item, $key, "/"); }); ?>
执行结果为:
name : Gary<br/> 0 : Squirtle<br/> 1 : Bulbasaur<br/> 2 : Charmander<br/> name : Ash<br/> 0 : Pikachu<br/> 1 : Squirtle<br/> name : Misty<br/> 0 : Staryu<br/> 1 : Togepi<br/>
三、array_walk_recursive函数注意事项
1、array_walk_recursive函数仅限于单个变量(scalar)的类型强制转换;如果回调函数试图修改数组结构,例如添加或删除元素,则函数将失败,因为它无法跟踪新索引。
2、 array_walk_recursive函数接受回调函数的引用参数(&$item)。这使得您可以修改函数内部的参数值。
3、传递给回调函数的$key参数是元素的键。如果是二维或更高维,则键将包括每个嵌套维。