2017-05-17 70 views
0

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

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

您正在为'节点'分配一个返回值,但该函数不返回任何内容 - >导致NULL。

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

但是当你现在运行的代码,它似乎是递归的结果将被忽略。对此的解决办法是改变你的foreach工作

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

这样的方式,$nodeItem任何更改时便会持续。

+0

真棒,谢谢! – HS1993