Php在递归调用

时间:2017-05-17 08:06:58

标签: php recursion

我在param中有一个引用方法。但是当我尝试进行递归调用时,没有值保存到我的数组中,尽管数组中应该有2个值。这是我的功能,问题是,当检查$nodesArray[$nodeKey]['nodes']时再次调用它。这应检查菜单子节点并返回所选角色可以看到的节点。在每个foreach循环结束时,我使用dump($nodesArray)。在检查子节点的最后一个循环之后,数组只有正确的值。但当它返回“主”循环时,['nodes']的值为NULL。可能有什么不对?谢谢!

private function filterMenuNodesByRole(& $nodesArray)
{
    foreach ($nodesArray as $nodeKey => $nodeItem) {
        $link = trim($nodeItem['href'], self::SEPARATOR_PRESENTER_LINK);

        if ((substr($link, -1) == '!') && ($this->user->isInRole(AuthRoleEnum::SUPERADMIN) === false)) {
            unset($nodesArray[$nodeKey]);
        }

        if (substr_count($link, self::SEPARATOR_PRESENTER_LINK) == 2) {
            $resource = substr($link, 0, strrpos($link, self::SEPARATOR_PRESENTER_LINK));
            $privilege = substr($link, strrpos($link, self::SEPARATOR_PRESENTER_LINK) + 1);

            if ($this->user->isAllowed($resource, $privilege) === false) {
                unset($nodesArray[$nodeKey]);
            } else if (!empty($nodeItem['nodes'])) {
                $nodesArray[$nodeKey]['nodes'] = $this->filterMenuNodesByRole($nodeItem['nodes']);
            }
        } else {
            if (!empty($nodeItem['nodes'])) {
                $nodesArray[$nodeKey]['nodes'] = $this->filterMenuNodesByRole($nodeItem['nodes']);
            }
        }

        if (isset($nodeItem['nodes']) && count($nodeItem['nodes']) == 0) {
            unset($nodesArray[$nodeKey]);
            continue;
        }
        dump($nodesArray);
    }
}

1 个答案:

答案 0 :(得分:1)

您要为“节点”分配返回值,但该功能不会返回任何内容 - >这导致了NULL。

$nodesArray[$nodeKey]['nodes'] = $this->filterMenuNodesByRole($nodeItem['nodes']); 应该 $this->filterMenuNodesByRole($nodeItem['nodes']);

但是当你现在运行代码时,似乎忽略了递归的结果。解决方案是改变你的foreach工作方式

foreach ($nodesArray as $nodeKey => & $nodeItem) {

这样,对$nodeItem的任何更改都将持续存在。