Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/256.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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递归迭代_Php_Arrays_Loops_Recursion - Fatal编程技术网

嵌套数组的PHP递归迭代

嵌套数组的PHP递归迭代,php,arrays,loops,recursion,Php,Arrays,Loops,Recursion,我有以下数组,数组的深度无法知道,因为数组可以有n个child $menu = [ [ 'name' => 'home', 'label' => 'Home', 'uri' => '/home', 'order' => 1, 'attributes' => [ 'class' => ['home-class', 'home-class-2'],

我有以下数组,数组的深度无法知道,因为数组可以有n个child

$menu = [
    [
        'name' => 'home',
        'label' => 'Home',
        'uri' => '/home',
        'order' => 1,
        'attributes' => [
            'class' => ['home-class', 'home-class-2'],
            'id' => ['home-id']
        ]
    ], [
        'name' => 'about',
        'label' => 'About',
        'uri' => '/about',
        'order' => 2,
        'attributes' => [
            'class' => [],
            'id' => []
        ],
        'child' => [
            [
                'name' => 'company_profile',
                'label' => 'Company Profile',
                'uri' => '/company-profile',
                'order' => 1,
                'attributes' => [
                    'class' => [],
                    'id' => []
                ]
            ], [
                'name' => 'team',
                'label' => 'Team',
                'uri' => '/team',
                'order' => 2,
                'attributes' => [
                    'class' => ['team-class', 'team-class-2'],
                    'id' => ['team-id']
                ],
                'child' => [
                    [
                        'name' => 'management_team',
                        'label' => 'Management Team',
                        'uri' => '/management-team',
                        'order' => 1,
                        'attributes' => [
                            'class' => [],
                            'id' => []
                        ]
                    ],
                    [
                        'name' => 'development_team',
                        'label' => 'Development Team',
                        'uri' => '/development-team',
                        'order' => 2,
                        'attributes' => [
                            'class' => [],
                            'id' => []
                        ]
                    ],

                ]
            ],
        ]
    ], [
        'name' => 'services',
        'label' => 'Services',
        'uri' => '/services',
        'order' => 3,
        'attributes' => [
            'class' => [],
            'id' => []
        ],
        'child' => [
            [
                'name' => 'web_application',
                'label' => 'Web Application',
                'uri' => '/web-application',
                'order' => 1,
                'attributes' => [
                    'class' => [],
                    'id' => []
                ]
            ], [
                'name' => 'mobile_application',
                'label' => 'Mobile Application',
                'uri' => '/mobile-application',
                'order' => 2,
                'attributes' => [
                    'class' => [],
                    'id' => []
                ]
            ], [
                'name' => 'cms_development',
                'label' => 'CMS Development',
                'uri' => '/cms-development',
                'order' => 3,
                'attributes' => [
                    'class' => [],
                    'id' => []
                ]
            ],
        ]
    ]
];
例如,我想循环并将数据传递给对象

$nav = new Navigation\Menu('main');
foreach ($menu as $item) {
    // Parent element
    $navItem = new Navigation\Item($item['name']);
    $navItem->setLabel($item['label']);
    $navItem->setUri($item['uri']);
    $nav->addItem($navItem);
    if (isset($item['child']) && is_array($item['child'])) {
        // First child
        foreach ($item['child'] as $child1) {
            $childItem1 = new Navigation\Item($child1['name']);
            $childItem1->setLabel($child1['label']);
            $childItem1->setUri($child1['uri']);
            $navItem->addChild($childItem1);
            if (isset($child1['child']) && is_array($child1['child'])) {
                // Second child
                foreach ($child1['child'] as $child2) {
                    $childItem2 = new Navigation\Item($child2['name']);
                    $childItem2->setLabel($child2['label']);
                    $childItem2->setUri($child2['uri']);
                    $childItem1->addChild($childItem2);
                }
            }
        }
    }
}
这是可行的,但有一个问题。正如您所看到的,我手动循环每个子级,我不希望这样,我要寻找的是,它必须递归地迭代数组,允许添加任意深度的任意数量的子级

我尝试了array\u walk\u递归或自定义递归函数,但没有任何结果。任何解决这一问题的方法都值得赞赏


谢谢。

这里有一个小的递归脚本,它应该运行在每个循环中。如果它是数组或对象,则每个递归将返回对象。现在需要对您的使用进行一些编辑。但它应该给你一个起点

function Navigation($item) {
    if (is_object($item)) {
        foreach (get_object_vars($item) as $property => $value) {
            //If item is an object, then run recursively
            if (is_array($value) || is_object($value)) {
                $item->$property =  Navigation($item);
            } else {
                $navItem->setLabel($item['label']);
                $navItem->setUri($item['uri']);
                $nav->addItem($navItem);
            }
        }
        return $nav;
    } elseif (is_array($item)) {
        foreach ($item as $property => $value) {
            //If item is an array, then run recursively
            if (is_array($value) || is_object($value)) {
                $item[$property] =  Navigation($item);
            } else {
                $navItem->setLabel($item['label']);
                $navItem->setUri($item['uri']);
                $nav->addItem($navItem);
            }
        }
        return $nav;
    }
    $navItem->setLabel($item['label']);
    $navItem->setUri($item['uri']);
    $nav->addItem($navItem);
}

这里有一个小的递归脚本,它应该运行在每个函数中,如果它是数组或对象,则每个递归将返回对象。现在需要对您的使用进行一些编辑。但它应该给你一个起点

function Navigation($item) {
    if (is_object($item)) {
        foreach (get_object_vars($item) as $property => $value) {
            //If item is an object, then run recursively
            if (is_array($value) || is_object($value)) {
                $item->$property =  Navigation($item);
            } else {
                $navItem->setLabel($item['label']);
                $navItem->setUri($item['uri']);
                $nav->addItem($navItem);
            }
        }
        return $nav;
    } elseif (is_array($item)) {
        foreach ($item as $property => $value) {
            //If item is an array, then run recursively
            if (is_array($value) || is_object($value)) {
                $item[$property] =  Navigation($item);
            } else {
                $navItem->setLabel($item['label']);
                $navItem->setUri($item['uri']);
                $nav->addItem($navItem);
            }
        }
        return $nav;
    }
    $navItem->setLabel($item['label']);
    $navItem->setUri($item['uri']);
    $nav->addItem($navItem);
}

我终于明白了

下面是我如何使用自定义递归函数实现的

function recursive($menu, &$nav, $child = false, $parent = null)
{
    foreach ($menu as $page) {
        $navItem = new Navigation\Item($page['name']);
        if (false == $child) {
            $nav->addItem($navItem);
        } else {
            $parent->addChild($navItem);
        }
        if (isset($page['child'])) {
            recursive($page['child'], $nav, true, $navItem);
        }
    }
}

$nav = new Navigation\Menu('main');
recursive($menu, $nav);

我终于明白了

下面是我如何使用自定义递归函数实现的

function recursive($menu, &$nav, $child = false, $parent = null)
{
    foreach ($menu as $page) {
        $navItem = new Navigation\Item($page['name']);
        if (false == $child) {
            $nav->addItem($navItem);
        } else {
            $parent->addChild($navItem);
        }
        if (isset($page['child'])) {
            recursive($page['child'], $nav, true, $navItem);
        }
    }
}

$nav = new Navigation\Menu('main');
recursive($menu, $nav);

RecursiveArrayIterator
似乎是一个不错的选择,也许我尝试过,使用它的问题是在添加元素时维护子元素和深度。
RecursiveArrayIterator
似乎是一个不错的选择,也许我尝试过,使用它的问题是在添加元素时维护子元素和深度。谢谢Andrew,这很有帮助,投票+1,我会发布正确的答案。很高兴我能帮上忙。有时,自定义Recrive脚本是最简单的方法。感谢Andrew,这有帮助,投票+1,我将发布正确的答案。很高兴我能提供帮助。有时,自定义Recrive脚本是最简单的方法。