【问题标题】:PHP push a value to an array during recursive searchPHP在递归搜索期间将值推送到数组
【发布时间】:2016-05-12 13:07:08
【问题描述】:
    $menus = [
        0 => [
            'id' => 'home',
            'title' => 'Home',
            'url' => '/display/home',
            'children' => [],
            'parent' => null
        ],
        1 => [
            'id' => 'nodes',
            'title' => 'Nodes',
            'url' => 'nodes/index',
            'children' => [
                0 => [
                    'id' => 'addNode',
                    'title' => 'Add Node',
                    'url' => '/nodes/add',
                    'children' => [],
                    'parent' => "nodes"
                ],
                1 => [
                    'id' => 'editNode',
                    'title' => 'Edit Node',
                    'url' => '/nodes/edit',
                    'children' => [],
                    'parent' => 'nodes'
                ],
                2 => [
                    'id' => 'deleteNode',
                    'title' => 'Delete Node',
                    'url' => '/nodes/delete',
                    'children' => [
                        0 => [
                            'id' => 'deleteMultipleNodes',
                            'title' => 'Delete Multiple Nodes',
                            'url' => '/nodes/deleteall',
                            'children' => [
                                0 => [
                                    'id' => 'deleteMultipleSelectedNodes',
                                    'title' => 'Delete Multiple Selected Nodes',
                                    'url' => '/nodes/deleteallselected',
                                    'children' => [],
                                    'parent' => 'deleteMultipleNodes'
                                ]
                            ],
                            'parent' => 'deleteNode'
                        ]
                    ],
                    'parent' => 'nodes'
                ]

            ],
            'parent' => null
        ]
    ];

假设我有这个数组。我想要的是递归地在这个数组中搜索一个 "id" ,如果找到,则将一个新的子元素推送到该元素的子数组中。

我通过不同的方式尝试过,我也尝试过使用 RecursiveArrayIterator 来遍历数组,但问题是如何在找到时将值推送到数组的索引穿越。

例如,这是我尝试过的代码:

private function traverseArray($array)
{

    $child = [
        'id' => 'deleteMultipleNotSelectedNodes',
        'title' => 'Delete Multiple Not Selected Nodes',
        'url' => '/nodes/deletenotselected',
        'children' => [],
        'parent' => 'deleteMultipleNodes'
    ];
    foreach($array as $key=>$value)
    {
        if(is_array($value))
        {
            $this->traverseArray($value);
        }
        if($key == "id" && $value == "deleteMultipleNodes") 
        {
            array_push($array["children"], $child); // This part is confusing me, How to add the child on this index where the id is found. 
        }
    }
}

任何有关如何以有效方式做这件事的帮助都会节省我的时间。

【问题讨论】:

  • 如果你在搜索中固定了deleteMultipleNodes,那么你一定知道索引,所以有什么困惑?
  • 把这个孩子推到什么索引上?
  • 它递归地向下钻取,如果它找到我想要将孩子推送到该 id 的元素的 ID。但我没有索引
  • 有一个children,你想要一个类似的吗?
  • 只是一个参数传递值/引用问题。

标签: php arrays recursion


【解决方案1】:

这就是它在不使用 $this 和修复比较 $value 时的错误而不是分配任何值的情况下的工作方式。

请注意与 &$array 和 &$value 的区别,它们是引用,因此它会更改原始数据而不是将其复制到新变量中。

<?php
$menus = [
        0 => [
            'id' => 'home',
            'title' => 'Home',
            'url' => '/display/home',
            'children' => [],
            'parent' => null
        ],
        1 => [
            'id' => 'nodes',
            'title' => 'Nodes',
            'url' => 'nodes/index',
            'children' => [
                0 => [
                    'id' => 'addNode',
                    'title' => 'Add Node',
                    'url' => '/nodes/add',
                    'children' => [],
                    'parent' => "nodes"
                ],
                1 => [
                    'id' => 'editNode',
                    'title' => 'Edit Node',
                    'url' => '/nodes/edit',
                    'children' => [],
                    'parent' => 'nodes'
                ],
                2 => [
                    'id' => 'deleteNode',
                    'title' => 'Delete Node',
                    'url' => '/nodes/delete',
                    'children' => [
                        0 => [
                            'id' => 'deleteMultipleNodes',
                            'title' => 'Delete Multiple Nodes',
                            'url' => '/nodes/deleteall',
                            'children' => [
                                0 => [
                                    'id' => 'deleteMultipleSelectedNodes',
                                    'title' => 'Delete Multiple Selected Nodes',
                                    'url' => '/nodes/deleteallselected',
                                    'children' => [],
                                    'parent' => 'deleteMultipleNodes'
                                ]
                            ],
                            'parent' => 'deleteNode'
                        ]
                    ],
                    'parent' => 'nodes'
                ]

            ],
            'parent' => null
        ]
    ];

function traverseArray(&$array)
{
    $child = [
        'id' => 'deleteMultipleNotSelectedNodes',
        'title' => 'Delete Multiple Not Selected Nodes',
        'url' => '/nodes/deletenotselected',
        'children' => [],
        'parent' => 'deleteMultipleNodes'
    ];
    foreach($array as $key=>&$value)
    {
        if(is_array($value))
        {
            traverseArray($value);
        }
        if($key == "id" && $value == "deleteMultipleNodes") 
        {
            array_push($array["children"], $child); 
        }
    }
}

echo "=== before \n";
var_export($menus);
echo "\n\n";
traverseArray($menus);
echo "=== after \n";
var_export($menus);

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2012-09-16
  • 1970-01-01
  • 2014-10-15
  • 2015-04-12
  • 2017-03-21
  • 1970-01-01
  • 2016-06-30
相关资源
最近更新 更多