Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 数组\u walk\u与数组递归?_Php_Arrays_Recursion - Fatal编程技术网

Php 数组\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(

我有一个菜单数组,它是一个多维数组,我想对每一项都做一些事情,所以我尝试了数组\u walk\u递归。这是菜单:

$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]
  ),
)