问题:
我正在尝试使用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..
)
也就是说,对于每个父母=&gt;生产孩子,然后转移到下一位家长等。提前感谢您的任何建议。
答案 0 :(得分:2)
这里不需要递归。事实上,由于你最终遇到SELECT N + 1问题,它将非常无效。只需按父级排序结果集:
$query = "SELECT CID, Item, Parent FROM betyg_category WHERE Status = '1' ORDER BY Parent";
$result = mysql_query($query);
$tree = array();
while($row = mysql_fetch_assoc($result)) {
if($row['Parent'] == 0) {
$row['Children'] = array();
$tree[$row['CID']] = $row;
} else {
$tree[$row['Parent']]['Children'][] = $row;
}
}
这将产生以下结果:
Array
(
[1] => Array
(
[CID] => 1
[Item] => Litteratur
[Parent] => 0
[Children] => Array
(
[0] => Array
(
[CID] => 2
[Item] => Integration av källorna
[Parent] => 1
)
[1] => Array
(
[CID] => 3
[Item] => Belysning
[Parent] => 1
)
[2] => Array
(
[CID] => 4
[Item] => Referenser
[Parent] => 1
)
)
)
[5] => Array
(
[CID] => 5
[Item] => Validitet
[Parent] => 0
[Children] => Array
(
[0] => Array
(
[CID] => 6
[Item] => Huvudsyfte
[Parent] => 5
)
)
)
)
如果您只想要每个孩子的名字,请更改,使用$tree[$row['Parent']]['Children'][] = $row['Item']
;代替。
答案 1 :(得分:2)
试试这个:
$array = array();
while ($row = mysql_fetch_assoc($result))
{
if($row['parent'] == '0')
{
$array[$row['parent']] = '';
$array[$row['parent']]['CID'] = $row['CID'];
$array[$row['parent']]['Item'] = $row['item'];
$array[$row['parent']]['Parent'] = $row['parent'];
$array[$row['parent']]['Children'] = '';
}
else
{
$array[$row['parent']]['Children'][$row['CID']] = $row['item'];
}
}
echo "<pre>";
print_r($array);
首先在您的查询中。添加ORDER BY CID ASC
然后
$count = array_keys($array);
foreach($count as $arr)
{
ksort($array[$arr]['Children']);
}
答案 2 :(得分:0)
所有评论的最终解决方案:
$query = "SELECT * FROM betyg_category WHERE Status = '1' ORDER BY CID ASC";
$result = mysql_query($query) or die ('Database Error (' . mysql_errno() . ') ' . mysql_error());
$tree = array();
while($row = mysql_fetch_assoc($result))
{
if($row['Parent'] == 0)
{
$row['Children'] = array();
$tree[$row['CID']] = array(
'CID' => $row['CID'],
'Item' => $row['Item'],
'Parent' => $row['Parent']
);
}
else
{
$tree[$row['Parent']]['Children'][$row['CID']] = $row['Item'];
}
}
$count = array_keys($tree);
foreach ($count as $array)
{
ksort($tree[$array]['Children']);
}
echo "<xmp>".print_r($tree, true)."</xmp>";