0

回到我的 JaxpTree 对象。该树应该将 MySQL 相关表对转换为遵循这种关系的嵌套树:


    /**
     * 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 崩溃了。

我在哪里错了?

4

1 回答 1

0

您在递归调用中提供的 $parent_id 将始终与您在第一次调用中使用的相同,因为据我所知,它没有在您的代码中的任何地方进行修改。所以这就是你的问题,你通过一遍又一遍地用相同的参数调用相同的函数来创建一个无限循环。

于 2010-03-01T12:20:54.750 回答