2010-02-28 21 views
0

返回我的JaxpTree對象。樹應該是一個MySQL相關的表對轉換爲如下這樣的關係嵌套樹:PHP樹實現:在遞歸循環中定義父引用


    /** 
    * Generates a JaxpTree structure. Parameters are used by the recursive 
    * function. Normally, they shouldn't be specified. 
    * 
    * @param int  $parent_id 
    * @param string $source_table 
    * @param bool $include_childs 
    * 
    * @access public 
    * @return JaxpTree 
    * @since 1.0 
    */ 
    function CreateTree(
     $parent_id = 0, 
     $source_table = "_NodeTable", 
     $include_childs = true 
    ) 
    { 
     # Copy field names to local variables for shortness. 
     $pfId = $this->_ParentIdField; 
     $fId = $this->_IdField; 
     $fL = $this->_LabelField; 

     # Determine source table. The iteration begins using NodeTable, 
     # then, to fetch the items, uses ItemTable. 
     $source_table = !$source_table ? "_NodeTable" : $source_table; 

     # Get all rows from the source table. 
     $rows = $this->{$source_table}->GetById($pfId, $parent_id, true); 

     # If no rows, no process will be done. 
     if ($rows) 
     { 
      # Iterate through the row list. 
      foreach ($rows as $r) 
      { 
       # Get label and id values. 
       $label = $r->Columns[$fL]->Value; 
       $id = $r->Columns[$fId]->Value; 

       # If this node has childrens... 
       if ($this->{$source_table}->GetById($pfId, $id) && $include_childs) 
       { 
        # Do recursive call using this node as root. 
        $array[$label] = $this->CreateTree($id); 

        # If this node has items... 
        if ($this->_ItemTable->GetById($pfId, $id)) 
        { 
         # Do recursive call using this node as root 
         # scanning the item table. 
         $array[$label]->ItemList = $this->CreateItemList($id); 
        } 
       } 
       else # This node has no child, so there's no need for 
        # more nested trees. 
       { 
        # Create a new TreeNode. 
        $new_node = new JaxpTreeNode($id); 

        # Send a JaxpMySqlRow object to the node. 
        # This will turn the row into node elements. 
        $new_node->LoadFromMySqlRow($r); 

        # Store the node. 
        $array[] = $new_node; 
        if ($source_table != "_ItemTable") 
        { 
         $array[$new_node->Attributes->Get($fL)->Value] = $new_node; 
        } 

        # If the node has items... 
        if ($this->_ItemTable->GetById($pfId, $id)) 
        { 
         # Do recursive call using this TreeNode as root 
         # scanning the item table. 
         $new_node->ItemList = $this->CreateItemList($id); 
        } 
       } # End checking for children. 
      } # End iterating the row list. 
     } # End checking for rows. 

     # Return a JaxpTree object, using the array as contents. 
     return (isset($array) 
       ? new JaxpTree(
         $array, null, 
         ($parent_id 
         ? $this->CreateTree($parent_id, "_NodeTable", false) 
         : null) 
       ) 
       : false); 
    } // CreateTree() 

當我嘗試與更多的家長參考返回對象(見斜體線),我被捲進無盡的遞歸循環和PHP崩潰。

我在哪裏錯了?

回答

0

您在遞歸調用中提供的$ parent_id將始終與您在第一次調用時使用的$ parent_id相同,因爲在我看到的代碼中沒有修改任何代碼。所以這就是你的問題,通過反覆調用相同的參數來創建一個無限循環。