Php 如何为uasort构建一个函数,将孩子置于家长之下
我有一个存储id>parent的数组 我想做的是使用PHP中的uasort函数对这个数组进行排序,将所有子数组放在它们的父数组下 所以如果我有Php 如何为uasort构建一个函数,将孩子置于家长之下,php,arrays,sorting,Php,Arrays,Sorting,我有一个存储id>parent的数组 我想做的是使用PHP中的uasort函数对这个数组进行排序,将所有子数组放在它们的父数组下 所以如果我有 ID>>PARENT 1 >> 0 2 >> 0 3 >> 1 4 >> 1 5 >> 0 6 >> 2 7 >> 6 8 >> 6 9 >> 2 然后我需要像这样返回结果 ID 1 3 4 2 6 7 8 9 Array (
ID>>PARENT
1 >> 0
2 >> 0
3 >> 1
4 >> 1
5 >> 0
6 >> 2
7 >> 6
8 >> 6
9 >> 2
然后我需要像这样返回结果
ID
1
3
4
2
6
7
8
9
Array (
[0] => Array
(
[ID] => 1
[PARENT] => 0
)
[1] => Array
(
[ID] => 2
[PARENT] => 0
)
[2] => Array
(
[ID] => 3
[PARENT] => 1
)
[3] => Array
(
[ID] => 4
[PARENT] => 1
)
[4] => Array
(
[ID] => 5
[PARENT] => 0
)
[5] => Array
(
[ID] => 6
[PARENT] => 2
)
[6] => Array
(
[ID] =>7
[PARENT] => 6
)
[7] => Array
(
[ID] =>8
[PARENT] => 6
)
[8] => Array
(
[ID] =>9
[PARENT] => 9
)
)
我的数组是这样的
ID
1
3
4
2
6
7
8
9
Array (
[0] => Array
(
[ID] => 1
[PARENT] => 0
)
[1] => Array
(
[ID] => 2
[PARENT] => 0
)
[2] => Array
(
[ID] => 3
[PARENT] => 1
)
[3] => Array
(
[ID] => 4
[PARENT] => 1
)
[4] => Array
(
[ID] => 5
[PARENT] => 0
)
[5] => Array
(
[ID] => 6
[PARENT] => 2
)
[6] => Array
(
[ID] =>7
[PARENT] => 6
)
[7] => Array
(
[ID] =>8
[PARENT] => 6
)
[8] => Array
(
[ID] =>9
[PARENT] => 9
)
)
这就是我所做的
uasort($survey, 'cmp');
print_r($survey);
function cmp($a, $b) {
if ($a['parent_id'] == $b['parent_id']) {
return 0;
}
return ($a['parent_id'] < $b['parent_id']) ? -1 : 1;
}
uasort($survey,'cmp');
印刷(调查);
功能cmp($a$b){
如果($a['parent\u id']=$b['parent\u id'])){
返回0;
}
回报($a['parent_id']<$b['parent_id'])?-1:1;
}
这段代码首先对所有父对象进行排序,然后在父对象之后对子对象进行排序,而不是在父对象之下
有人能帮我解决这个问题吗?uasort()
和朋友不太适合这里的purpouse:假设你想比较父N的最后一个子和下一个父N+1-子应该比较得更小。如果同一个孩子的父母是N+1,那么需要比较大一点。这是可行的,只要你只有一个等级,但如果你有更多的等级,它会变得很好
我建议您使用另一种方法:
- 步骤1:按父项将条目分组到数组中
- 步骤2:分别对子数组进行排序
- 步骤3:通过递归展平结构:
- 以当前父id 0和空的最终id开始
- 重复
- 将具有当前父id的数组的第一行移动到最后一个数组的末尾
- 如果没有,请返回
- 以此行的id作为当前父id递归
<?php
function flatten($parentid, &$parents, &$final) {
if (!isset($parents[$parentid])) return;
$children=$parents[$parentid];
unset($parents[$parentid]);
//repeat
while (true) {
//move the first row of the array with the current parent id to the end of the final array
$child=array_shift($children);
//if none available, return
if (!$child) break;
$final[]=$child;
//recurse with the id of this row as the current parent id
flatten($child['ID'],$parents,$final);
}
}
//Step 1: Group entries into an array of arrays by parent
//In your input, both PARENT==ID and PARENT==0 are used for root nodes
$parents=array();
foreach ($input as $item) {
$parent=$item['PARENT'];
if ($parent==$item['ID']) $parent=0;
if (isset($parents[$parent])) $parents[$parent][$item['ID']]=$item;
else $parents[$parent]=array($item['ID']=>$item);
}
//Step 2: Sort the sub-arrays individually
foreach ($parents as $item) ksort($item);
//Step 3: Flatten the structure by recursion:
//start with current parent id 0 and an empty final
$final=array();
flatten(0, $parents, $final);
//Done
print_r($final);
?>
循环数组并生成排序版本
$arr2 = array();
foreach ( $arr as $k => $v ) {
if ( $v['PARENT'] > 0 ) {
$arr2[$v['PARENT']][$k] = $v;
}
}
ksort($arr2);
使用您的示例(并更正信息中的不匹配),我得到以下信息
Array
(
[1] => Array
(
[3] => Array
(
[ID] => 3
[PARENT] => 1
)
[4] => Array
(
[ID] => 4
[PARENT] => 1
)
)
[2] => Array
(
[6] => Array
(
[ID] => 6
[PARENT] => 2
)
[9] => Array
(
[ID] => 9
[PARENT] => 2
)
)
[6] => Array
(
[7] => Array
(
[ID] => 7
[PARENT] => 6
)
[8] => Array
(
[ID] => 8
[PARENT] => 6
)
)
)
你能帮我写一些代码吗?我正试图写这段代码,但我没有得到想要的结果。这是行不通的。你必须在解决方案中包含ID吗?如果你继续复制你的帖子,你很快就会发现自己无法再发布更多的帖子。。。如果你还没有到那里。