【问题标题】:php recursive function with referencephp递归函数有参考
【发布时间】:2017-10-14 08:09:54
【问题描述】:

我有带有引用参数的递归函数。它通过导航,检查是否允许用户查看当前节点。但是当它进入子节点($nodeItem['nodes'])时,它在其实例中运行良好,但不会返回减少的array。所以这就是问题所在。当它转到我不应该访问的 subnodes 时,它会在其实例中取消设置它们,但是当它返回数组并且我回到主导航节点数组时,所有子节点都回来了。可能有什么问题?

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

        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]);
                dump($nodeItem);
                dump($nodesArray);
            } else if (!empty($nodeItem['nodes'])) {
                $this->getNodesByRole($nodeItem['nodes']);
            }

        } else {
            if (!empty($nodeItem['nodes'])) {
                $this->getNodesByRole($nodeItem['nodes']);
            }
        }

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

【问题讨论】:

    标签: php recursion pass-by-reference


    【解决方案1】:

    需要将返回的数组设置为当前状态数组,像这样

    private function getNodesByRole(&$nodesArray)
    {
    foreach ($nodesArray as $nodeKey => $nodeItem) {
        $link = trim($nodeItem['href'], self::SEPARATOR_PRESENTER_LINK);
    
        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]);
                dump($nodeItem);
                dump($nodesArray);
            } else if (!empty($nodeItem['nodes'])) {
                $nodesArray = $this->getNodesByRole($nodeItem['nodes']);
            }
    
        } else {
            if (!empty($nodeItem['nodes'])) {
                $nodesArray = $this->getNodesByRole($nodeItem['nodes']);
            }
        }
    
        if (isset($nodeItem['nodes']) && count($nodeItem['nodes']) == 0) {
            unset($nodesArray[$nodeKey]);
            continue;
        }
    }
    return $nodesArray;
    }
    

    希望对你有帮助!

    【讨论】:

    • 我只需要编辑,返回不是保存到$nodesArray,而是保存到$nodesArray[$nodeKey]['nodes'],效果很好,谢谢!!
    猜你喜欢
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    • 2016-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-09
    • 1970-01-01
    相关资源
    最近更新 更多