Php 首先按根类别对类别数组排序

Php 首先按根类别对类别数组排序,php,Php,我想对给定的类别数组进行排序。在新数组中,根类别必须首先出现在其子类别之前 示例数据: $data = [ ['id' => '1', 'name' => 'abc', 'parent_id' => '0' ], ['id' => '4', 'name' => 'def', 'parent_id' => '5' ], ['id' => '3', 'name' => 'ghj', 'parent_id' => '2' ], ['

我想对给定的类别数组进行排序。在新数组中,根类别必须首先出现在其子类别之前

示例数据:

$data = [
  ['id' => '1', 'name' => 'abc', 'parent_id' => '0' ],
  ['id' => '4', 'name' => 'def', 'parent_id' => '5' ],
  ['id' => '3', 'name' => 'ghj', 'parent_id' => '2' ],
  ['id' => '5', 'name' => 'zst', 'parent_id' => '1' ],
  ['id' => '2', 'name' => 'klm', 'parent_id' => '1' ],
];
我希望实现的产出:

$output = [
  '1' => ['id' => '1', 'name' => 'abc', 'parent_id' => '0' ],
  '5' => ['id' => '5', 'name' => 'zst', 'parent_id' => '1' ],
  '4' => ['id' => '4', 'name' => 'def', 'parent_id' => '5' ],
  '2' => ['id' => '2', 'name' => 'klm', 'parent_id' => '1' ],
  '3' => ['id' => '3', 'name' => 'ghj', 'parent_id' => '2' ],
];
我的代码到现在为止:

function sortCategories($data) {
  $output = [];
  foreach ($data as $category) {
    if ($output[$category['id']] || $output[$category['parent_id']])
      continue;

    if (!$output[$category['parent_id']])
      $output = getParentCategories($category, $ouput, $data);

    $output[$category['id']] = [
      'id' => $category['id'],
      'name' => $category['name'],
      'parent_id' => $category['parent_id']
    ];
  }
  return $output;
}

function getParentCategories($category, $output, $data) {
  if ($output[$category['parent_id']]) {
    return $output;
  } else {
  }
}
我的问题是,我不知道如何实现getParentCategories(),以便该函数以正确的方式处理根类别


有什么解决问题的建议吗

由于PHP7,我们可以像这样使用spaceship操作符

usort($output, function ($a,$b) {
   return $a['parent_id'].$a['id'] <=> $b['parent_id'].$b['id'];
});
usort($output,function($a,$b){
返回$a['parent\u id'].$a['id]$b['parent\u id'].$b['id'];
});
这两个id都连接在一起,以便对
id
parent\u id
进行排序,
parent\u id
优先于
id


在实际情况下,
id
的范围可能大于0..9,而您想要的是5<12,这与上面代码中比较字符串时的情况不同。也许你可以发布一个考虑到这一点的代码,让我们检查一下。也许还可以先了解
'1'=>['id'=>'1']
1=>['id'=>1]
之间的区别。

使用
foreach()的解决方案将适用于您:-

<?php 
$data = [
  ['id' => '1', 'name' => 'abc', 'parent_id' => '0' ],
  ['id' => '4', 'name' => 'def', 'parent_id' => '5' ],
  ['id' => '3', 'name' => 'ghj', 'parent_id' => '2' ],
  ['id' => '5', 'name' => 'zst', 'parent_id' => '1' ],
  ['id' => '2', 'name' => 'klm', 'parent_id' => '1' ],
]; // original array

$new_array = array(); // new empty array

foreach($data as $key=>$value){ // iterate through original array
    if($value['parent_id'] == 0){ // check root value
        $new_array[$value['id']] = $value; // assign full sub-array to newly created array
    }else{ // if not root value
        $get_key = searchForId($value['parent_id'],$data); // based on parent-id get the parent array key from original array
            $new_array[$data[$get_key]['id']] = $data[$get_key]; // based on key assign parent array to the newly created array
            $new_array[$value['id']] = $value; // assign the child array to newly created array
    }

}
function searchForId($id, $array) { // send parent_id and original array
   foreach ($array as $key => $val) {
       if ($val['id'] === $id) {
           return $key; // return key of parent id
       }
   }
   return null;
}
echo "<pre/>";print_r($new_array); // print new array
?>


输出:-

@Anant或更短:不幸的是没有。因为我无法按父id对数组进行排序。请澄清
。也许可以删除这些单词,改用
parent\u id
id
(或者相反,这可能会造成混淆)。好的做法是避免使用同义词,但旧版本又如何呢。我测试了你的php5.514代码,但它不起作用。@Anant我想给你一个转换的练习。不是给我,是给OP。因为他/她可能需要这个(因为旧版本)@Anant oops,对不起。你的解释在理解我试图解决的真正问题方面帮助了我很多。只是玩了一会,我自己用另一个解决方案解决了。非常感谢@别客气。我认为这个代码也是sort+clean