2017-05-17 106 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