Php 数组\u walk\u与数组递归?
我有一个菜单数组,它是一个多维数组,我想对每一项都做一些事情,所以我尝试了数组\u walk\u递归。这是菜单:Php 数组\u walk\u与数组递归?,php,arrays,recursion,Php,Arrays,Recursion,我有一个菜单数组,它是一个多维数组,我想对每一项都做一些事情,所以我尝试了数组\u walk\u递归。这是菜单: $menu = array( array( 'name'=>'a', 'url'=>'b', ), array( 'name'=>'c', 'url'=>'d', 'children'=>array( array(
$menu = array(
array(
'name'=>'a',
'url'=>'b',
),
array(
'name'=>'c',
'url'=>'d',
'children'=>array(
array(
'name'=>'e',
'url'=>'f'
)
)
)
);
但是array\u walk\u recursive只允许我处理每个元素,而不是array
array_walk_recursive($menu, function(&$item){
var_dump($item);//return a;b;c;d;e;f;g
});
我想要的是这样的:
array_walk_recursive_with_array($menu, function(&$item){
var_dump($item);//return array('name'=>'a','url'=>'b');a;b;array('name'=>'c',...);c;d;...
if(is_array($item) && isset($item['name'])){
// I want to do something with the item.
}
})
是否有任何PHP本机函数实现?根据,无法获取内部数组键。
实现需求的一种方法是使用array_walk并创建自己的递归性
function HandleArray(&$value){
if(is_array($value)){
//Do something with all array
array_walk($value,'HandleArray');
}
else{
//do something with your scalar value
}
}
array_walk(array($your_array),'HandleArray');
您希望递归搜索数组,并在每次遇到包含
name
键的数组时执行一些操作
为了演示,这里有一个示例数组,它有一个非限定子数组($array[1]
)和三个限定子数组($array[0]
,$array[2]
,以及$array[2]['children']
)
要处理数组,请递归访问数据结构中的每个节点。遇到数组时,使用isset()
(或array\u key\u exists()
检查数组是否符合所需操作
下面是一个脚本,它将使用限定规则执行递归技术,并在满足规则时添加新元素&
用于两个位置,以指示变量应“通过引用修改”——这使得数据突变在自定义函数调用范围之外可用
代码:()
输出:
array (
0 =>
array (
'name' => 'a',
'url' => 'b',
0 => 'push a new element into array level', // added element to $array[0]
),
1 =>
array ( // didn't qualify
'no-name' => 'foo',
),
2 =>
array (
'name' => 'c',
'url' => 'd',
'children' =>
array (
0 =>
array (
'name' => 'e',
'url' => 'f',
0 => 'push a new element into array level', // added element to $array[2]['children']
),
),
0 => 'push a new element into array level', // added element to $array[2]
),
)
array\u walk\u recursive
可能需要修改数组。执行array\u walk\u recursive
后,您希望您的$菜单如何运行。对。根据PHP文档:“任何保存数组的键都不会传递给函数。”这是为什么,我无法理解。对于名为“recursive”的函数来说,这似乎是违反直觉的。
function recurseAll(&$node) {
if (is_array($node)) {
if (isset($node['name'])) {
// do something with the qualifying array...
$node[] = 'push a new element into array level';
}
foreach ($node as &$childNode) {
recurseAll($childNode);
}
}
}
recurseAll($array);
var_export($array);
array (
0 =>
array (
'name' => 'a',
'url' => 'b',
0 => 'push a new element into array level', // added element to $array[0]
),
1 =>
array ( // didn't qualify
'no-name' => 'foo',
),
2 =>
array (
'name' => 'c',
'url' => 'd',
'children' =>
array (
0 =>
array (
'name' => 'e',
'url' => 'f',
0 => 'push a new element into array level', // added element to $array[2]['children']
),
),
0 => 'push a new element into array level', // added element to $array[2]
),
)