2017-01-22 75 views
1

我有一個用戶表和分層用戶。所以用戶可以有一個父用戶。我正在嘗試返回某個用戶的所有子用戶ID的數組。 我的函數返回「null」。怎麼了?concat tree hierarchie在遞歸PHP函數中

public function userDownline($userid, $result = array()) { 
    $dbconn = $this->DBase(); 
    $children = $dbconn->GetAll('SELECT id FROM users WHERE parent=' . (int)$userid); 
    if(count($children) > 0) { 
     foreach($children As $k=>$v) { 
      if(!in_array($v['id'], $result)) $result[] = $v['id']; 
      $this->userDownline($v['id'], $result); 
     } 
    } else { 
     return $result; 
    } 
}  

回答

1

當然,它會返回null,因爲你在塊if(count($ children))並且沒有從這返回。

我認爲你必須做這樣的事情:

<?php 
public function userDownline($userid, &$result = array()) 
{ 
    $dbconn = $this->DBase(); 
    $children = $dbconn->GetAll('SELECT id FROM users WHERE parent=' . (int)$userid); 
    if (count($children) > 0) { 
     foreach ($children As $k => $v) { 
      if (!in_array($v['id'], $result)) $result[] = $v['id']; 
      $this->userDownline($v['id'], $result); 
     } 
    } 
    return $result; 
} 

我加入的功能特徵參考和移動回了條件塊的。

但是這實際上是非常低效的方式並且很危險(因爲 - 內存不足,嵌套層次太多以及其他例外)。

有2點更好的方法:

  1. 使用https://neo4j.com/ - 圖形數據庫 - 爲您的任務最好的選擇。
  2. 如果你仍然想使用只有SQL數據庫 - 瞭解組嵌套模式http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/
+0

謝謝 - 我加了一個「回」到上述線路 - 現在我得到了第一個孩子(1條記錄,而不是許多)。 – Gerfried

+0

mikehillyer網站真棒 - 謝謝!爲此+1。 – Gerfried

+0

我再次看了一遍,並用代碼更新了我的答案。 – vuliad