foreach循环函数结果到数组

时间:2013-12-30 18:45:20

标签: php arrays binary-tree hierarchical-data

我有这个功能:

 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结果变成一个新的数组,这样我就可以对它进行排序或分页。

所以有任何帮助修改我的代码来执行此操作吗?

1 个答案:

答案 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)