鍍金池/ 問(wèn)答/PHP  數(shù)據(jù)庫(kù)  HTML/ 無(wú)限的父子關(guān)系樹(shù)如何排序?

無(wú)限的父子關(guān)系樹(shù)如何排序?

數(shù)據(jù)結(jié)構(gòu)大概是這樣的.{id:parentIds} id是唯一的,parentIds儲(chǔ)存了上級(jí)的ids.例如父類為id=1下的id=5下的id=9 parentIds就為1,5,9 最高層的parentIds為0 那這樣如何進(jìn)行一個(gè)排序呢?

例如現(xiàn)在的數(shù)據(jù)是:

array(
    '1'=>'0',
    '2'=>'0',
    '3'=>'0',
    '4'=>'1',
    '5'=>'1',
    '6'=>'2',
    '7'=>'1',
    '8'=>'1',
    '9'=>'2',
    '10'=>'3',
    '11'=>'3',
    '12'=>'2',
    '13'=>'1',
    '14'=>'1,8',
    '15'=>'1,8,14',
    '16'=>'2,9',
    '17'=>'1,8',
    '18'=>'3,10',
    '19'=>'3,11',
    '20'=>'3,10,18',
    '21'=>'1,8,14,15',
    '22'=>'1,8,14');

處理過(guò)后(同級(jí)可不按順序):

array(
    '1'=>'0',
    '4'=>'1',
    '5'=>'1',
    '7'=>'1',
    '8'=>'1',
    '14'=>'1,8',
    '15'=>'1,8,14',
    '22'=>'1,8,14');
    '21'=>'1,8,14,15',
    '17'=>'1,8',
    '13'=>'1',
    '2'=>'0',
    '6'=>'2',
    '9'=>'2',
    '16'=>'2,9',
    '12'=>'2',
    '3'=>'0',
    '10'=>'3',
    '18'=>'3,10',
    '20'=>'3,10,18',
    '11'=>'3',
    '19'=>'3,11',
回答
編輯回答
痞性

把path轉(zhuǎn)換成版本號(hào)進(jìn)行對(duì)比排序

$a = [
    '1' => '0',
    '2' => '0',
    '3' => '0',
    '4' => '1',
    '5' => '1',
    '6' => '2',
    '7' => '1',
    '8' => '1',
    '9' => '2',
    '10' => '3',
    '11' => '3',
    '12' => '2',
    '13' => '1',
    '14' => '1,8',
    '15' => '1,8,14',
    '16' => '2,9',
    '17' => '1,8',
    '18' => '3,10',
    '19' => '3,11',
    '20' => '3,10,18',
    '21' => '1,8,14,15',
    '22' => '1,8,14',
];

$result = treeSort($a);
print_r($result);

function treeSort($arr)
{
    $list = [];
    foreach ($arr as $key => $item) {
        $version = $item == 0 ? $item : ('0.' . $item);
        $list[] = [$key, str_replace(',', '.', $version) . '.' . $key];
    }
    $mySort = function ($a, $b) {
        return version_compare($a[1], $b[1], 'ge');
    };
    usort($list, $mySort);
    $tree = [];
    foreach ($list as $item) {
        $tree[$item[0]] = $arr[$item[0]];
    }
    return $tree;
}
2018年6月4日 19:32