我有这个功能:
function subtree($id, $parents) {
echo $id;
if (isset($parents[$id]))
foreach ($parents[$id] as $child)
{
subtree($child, $parents);
}
}
$ parents是每个父母和他的(左,右孩子)的数组 $ id是我想要孩子的父ID。
$res = $db->query('SELECT p.id AS parent, GROUP_CONCAT( c.id ) AS children
FROM rev_r_clients AS p
JOIN rev_r_clients AS c ON c.parent_client_id = p.id
GROUP BY p.id');
$parents = Array();
while($row = $res->fetch_assoc()) {
$parents[$row['parent']] = explode(',',$row['children']);
}
循环函数子树的结果全部在一个页面中而没有排序。 所以我现在想要的是将childs结果变成一个新的数组,这样我就可以对它进行排序或分页。
所以有任何帮助修改我的代码来执行此操作吗?
答案 0 :(得分:0)
您可以在查询中执行此操作,以便在将它们插入数组之前已经对所有父项及其子项进行了排序
SELECT p.id AS parent, c.id AS children
FROM rev_r_clients AS p
JOIN rev_r_clients AS c ON c.parent_client_id = p.id
GROUP BY p.id
ORDER BY p.id ASC, c.id ASC
(你加入的方式告诉我你在一张桌子上有父母和孩子,这看起来很奇怪/错误)
所以一个示例输出将是:(我假设每个父母只有一个右或左孩子,但这适用于任何数量的孩子)
parent children
1 1
1 2
2 1
2 2
3 1
3 2
4 1
4 2
所以它按父母排序(最低id - >最大id),然后是他们最低的id孩子 - >最高的孩子
所以当它进入你的循环
while ($row = $res->fetch_assoc()) {
$parents[$row['parent']][] = $row['children']
$children[] = $row['children'];
}
它会自动排序。
$ children数组应该按照父母的顺序包含所有孩子。
$ parents示例输出:
array(
1 => array(1,2),
2 => array(1,2),
3 => array(1,2),
4 => array(1,2)
);
$ children示例输出:
array(1,2,1,2,1,2,1,2);
我假设孩子的id在数据库中已经是唯一的(不是1,2,1,2)