PHP树的实现:递归循环定义家长参考
题
回到我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崩溃。
我在哪里去错在这里?
解决方案
在$ PARENT_ID您在递归调用将始终是相同的是你的第一个电话所使用的提供,因为它没有任何地方在你的代码,据我看到修改。所以这就是你的问题,您通过一遍又一遍的呼唤与相同参数相同功能的无限循环。
不隶属于 StackOverflow