2013-04-18 50 views
-1

我有一張代表代理的表。每個機構可能有或沒有父母(fk_organismo)。沒有父母的機構(fk_organismo = NULL)是根機構。PHP從特定節點開始構建樹的函數

table structure

誰能幫我配個PHP功能(遞歸與否),可以建立起一個完整的層次結構樹,而且還可以接收一個可選參數:fk_organismo(parent_agency_id)。如果這個參數不是NULL,樹應該從這個特定的機構開始構建?

  1. 我必須表現出在樹上
  2. 所有的機構都必須表現出從一個特定

我也想我將不得不啓動所有兒童機構的樹建立兩(2)個單獨的SQL查詢,其中一個用於獲取所有代理,另一個用於從特定代理獲取所有子代,但不知道...

感謝很多提前

+1

http://waliaz.com/modified-pre-ordered-traversal-tree-mptt--- explained.html –

回答

1

我想是這樣的(固定,測試)

$conn = new mysqli("hostname","user","password","database"); 
if($conn->connect_errno) { 
    printf("Connect failed: %s\n",$conn->connect_error); 
    exit(); 
} 

function dbToTree(){ 
//Set up your connection to mysql first 
    global $conn; 

    $sql = "SELECT * FROM `database`.`table` WHERE `fk_organismo` IS NULL ORDER BY `id` ASC LIMIT 1000;"; 

    $result = $conn->query($sql); 

    for($i = 0; $db_array[$i] = $result->fetch_array(MYSQLI_ASSOC); $i++); 

    array_pop($db_array); //The last part of the array is empty, remove it 

    foreach($db_array as $row => $columns){ 
     $db_tree[$columns['nombre']]['info'] = $columns; //Tree root is ID of agency 

     $db_tree[$columns['nombre']]['children'] = find_children($columns['id']); 
    } 
    return $db_tree; 
} 

function find_children($fk_organismo){ 
     global $conn; 
     $sql = "SELECT * FROM `database`.`table` WHERE `fk_organismo` = " . $fk_organismo . " ORDER BY id desc"; 
     //die($sql); 
     $result = $conn->query($sql); 
     if(!$result) return NULL; 
     for($i = 0; $tmp[$i] = $result->fetch_array(MYSQLI_ASSOC); $i++); 

     array_pop($tmp); 
     foreach($tmp as $tmp_row => $tmp_columns){ 
      $return[$tmp_columns['nombre']]['info'] = $tmp_columns; 
      $return[$tmp_columns['nombre']]['children'] = find_children($tmp_columns['id']); 
     } 
     if(empty($return)) return NULL; 
     return $return; 
}