【问题标题】:building parent-child relationship from array从数组建立父子关系
【发布时间】:2019-05-05 11:45:27
【问题描述】:

我们有一个随机类别列表,需要按照以下规则在 JSON 输出中排列 - 一种。所有父类别应按字母顺序排序 湾。每个父类别都应该有一个按字母顺序排序的子类别 C。父子关系可以是多级的

    function hierarchy($data){
        $arr=array();
        foreach($data as $row){
            $subarr=[];
            if($row['parent']==null){
                $subarr[$row['_id']]=$row;
                $childs=findcs($row,$data);
                print_r($childs);
            }
            array_push($arr,$subarr);
        }
        print_r($arr);
    }

    function findcs($row,$data){
        $allChilds=[];
        foreach($data as $item){
            if($item['_id']==$item['parent']){
                $child=[];
                $child[$item['_id']]=$item;
                array_push($allChilds,$child);
                findcs(item['_id'],$data);
            }
        }
        return $allChilds;
    }

$data=[
    [
        "name"=> "Travel",
        "parent"=> null,
        "_id"=> 1,
    ],
    [
        "name"=>"Air Travel",
        "parent"=> 1,
        "_id"=> 1212,
    ],
    [
        "name"=> "Hotel",
        "parent"=> 1,
        "_id"=>212,
    ],
    [
        "name"=> "Businss Exp",
        "parent"=> null,
        "_id"=> 2,
    ],
    [
        "name"=> "Taxes",
        "parent"=> 2,
        "_id"=> 34,
    ],
    [
        "name"=> "Local Tax",
        "parent"=> 34,
        "_id"=> 34111,
    ],
    [
        "name"=>"Licenses",
        "parent"=> 34,
        "_id"=> 111232,
    ],
    [
        "name"=> "Insurance",
        "parent"=> 1212,
        "_id"=>113412,
    ],
];

【问题讨论】:

  • 您可以发布$data 示例吗?你如何确定他们之间的亲子关系?缺少上下文。

标签: php


【解决方案1】:

此代码将假定父元素将出现在子元素之前。它将没有父 id 的任何内容添加到输出数组的基数 ($out),否则它调用递归函数 addChild()。 (忘记了,所以添加)将每个条目添加到现有子项时,这使用usort() 按字母顺序对条目进行排序。

这会查看每个节点并检查它是否是父节点,如果不是,它还将查看该节点的任何子节点(如果有的话)等等......

function addChild ( $element, &$tree )   {
    foreach ( $tree as &$leaf )  {
        if ( $leaf['_id'] == $element['parent'] )   {
            $leaf['children'][] = $element;
            usort($leaf['children'], 
                function($a, $b) { 
                    return strcmp($a["name"], $b["name"]); 
                });
            break;
        }
        if ( isset($leaf['children']) ) {
            addChild($element, $leaf['children']);
        }
    }
}
$out = [];
foreach ( $data as $element )   {
    if ( empty($element['parent']) )  {
        $out[] = $element;
    }
    else    {
        // Look for parent
        addChild($element, $out);
    }
}

创建...

Array
(
    [0] => Array
        (
            [name] => Travel
            [parent] => 
            [_id] => 1
            [children] => Array
                (
                    [0] => Array
                        (
                            [name] => Air Travel
                            [parent] => 1
                            [_id] => 1212
                            [children] => Array
                                (
                                    [0] => Array
                                        (
                                            [name] => Insurance
                                            [parent] => 1212
                                            [_id] => 113412
                                        )

                                )

                        )

                    [1] => Array
                        (
                            [name] => Hotel
                            [parent] => 1
                            [_id] => 212
                        )

                )

        )

    [1] => Array
        (
            [name] => Businss Exp
            [parent] => 
            [_id] => 2
            [children] => Array
                (
                    [0] => Array
                        (
                            [name] => Taxes
                            [parent] => 2
                            [_id] => 34
                            [children] => Array
                                (
                                    [0] => Array
                                        (
                                            [name] => Licenses
                                            [parent] => 34
                                            [_id] => 111232
                                        )

                                    [1] => Array
                                        (
                                            [name] => Local Tax
                                            [parent] => 34
                                            [_id] => 34111
                                        )

                                )

                        )

                )

        )

)

【讨论】:

    猜你喜欢
    • 2013-02-20
    • 1970-01-01
    • 2017-12-20
    • 2012-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多