【发布时间】:2012-06-12 16:50:17
【问题描述】:
问题:
我正在尝试使用 MySQL 中的函数和数据构建递归树。但是,结果并不如预期。
PHP 代码:
function buildTree($root, $next = array())
{
// Sanitize input
$root = (int) $root;
// Do query
$query = "SELECT CID, Item, Parent FROM betyg_category WHERE Status = '1' AND Parent = '{$root}'";
$result = mysql_query($query) or die ('Database Error (' . mysql_errno() . ') ' . mysql_error());
// Loop results
while ($row = mysql_fetch_assoc($result))
{
$next[$row['CID']] = array (
'CID' => $row['CID'],
'Item' => $row['Item'],
'Parent' => $row['Parent'],
'Children' => buildTree($row['CID'], $next)
);
}
// Free mysql result resource
mysql_free_result($result);
// Return new array
return $next;
}
$testTree = buildTree(0);
echo "<xmp>".print_r($testTree, true)."</xmp>";
数据库中的表如下所示:
我希望数组是这样的:
Array
(
[1] => Array
(
[CID] => 1
[Item] => Litteratur
[Parent] => 0
[Children] => Array
(
[2] => Integration av källorna
[3] => Belysning av egna resultat
[4] => Referenser
)
)
and so forth..
)
也就是说,对于每个父母 => 生孩子,然后转到下一个父母等等。提前感谢您的任何建议。
【问题讨论】:
-
你为什么不提供你得到的结果,这样人们就可以看到你当前从你的代码中产生了什么
-
@Lee 我想这样做,但结果会一直循环下去,我必须按转义键,这样浏览器才不会崩溃。换句话说,这个列表太长了,我觉得还不够。
-
将 buildTree($row['CID'], $next) 更改为 buildTree($row['CID']) ... 现在会发生什么?
-
如何添加一个计数器来记录已通过的行数,然后在该点之后返回,以进行调试。此外,您真的应该使用准备好的语句。我知道您可以通过将参数转换为整数来避免 SQL 注入,但这是事情的原理。另外,我假设 php 允许你使用任何数组索引,或者你的数组的顶层可能太稀疏(它太长了)。
标签: php mysql sql arrays recursion