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的数组

我想做的是使用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 (
     [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递归
编辑

根据要求提供一些代码:这对我来说适用于您的示例

请注意,您的示例似乎有点冗长:您想要的输出缺少ID 5,而大多数根节点使用0作为父节点,而ID 9使用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吗?如果你继续复制你的帖子,你很快就会发现自己无法再发布更多的帖子。。。如果你还没有到那里。