如果不知道其中有多少个级别,请按键将平面数组分组为多维数组。的PHP

gdfgdfg

我有这个数组:

$arr = [
["id"=>20,
    "name"=>"a",
    "parent"=>28,
],
["id"=>21,
    "name"=>"a-child",
    "parent"=>20,
],
["id"=>27,
    "name"=>"a-child-b",
    "parent"=>20,
],
["id"=>28,
   "name"=>"A parent",
   "parent"=>0,
],
["id"=>12,
    "name"=>"no parent",
    "parent"=>0,
]];

我想要的是基于parent对其进行分组,如果父键大于零,则其中parent = id && parent > 0或是id该元素的父元素,并且该元素具有父元素。

在上面的数组id=12中,没有父项,id=20有子项21, 27,并且是的子项id=28

我做了什么 :

    public function sort($arr){

    $result = [];

    // Get child
    foreach($arr as $key => $row) {
        if($row['parent'] > 0) {
            $result[$row->parent][] = ['id' => $row['id'], 'name' => $row['name']];
            unset($arr[$key]);
        }
    }

    // Get parent and append child
    foreach($arr as $key => $row) {
        $result[$row['id']] = ['name' => $row['name'],
                              'child' => $result[$row['id']]];

    }
    return $result;
}

问题是,这仅适用于1级孩子parent => child array()

我想做的是一个获取参数(在数组上方)的方法,我不知道我将拥有多少层嵌套并parent按键数组分组返回结果

$arr = [
["id"=>28,
 "name"=>"A parent",
 "parent"=>0,
    'child' => [
        ["id"=>20,
             "name"=>"a",
             "parent"=>28,
             'child' => [
                 ["id"=>21,
                  "name"=>"a-child",
                  "parent"=>20,
                 ],
                 ["id"=>27,
                  "name"=>"a-child-b",
                  "parent"=>20,
                 ]
             ]
        ]
    ]
],
["id"=>12,
 "name"=>"no parent",
 "parent"=>0,
]];
nice_dev
<?php

define('ROOT_PARENT',0);

function getHierarchy($records){
    $hierarchy = [];

    /*
        let's assume everybody is going to be a parent
    */

    foreach($records as $each_record){
        $each_record['child'] = [];
        $hierarchy[$each_record['id']] = $each_record;
    }

    /*
       Now add child to parent's key in $hierarchy in the 'child' key. 
       The & is important since there may be future childs for current child. So pass by reference is needed
    */
    foreach($records as $each_record){
        $hierarchy[$each_record['parent']]['child'][] = &$hierarchy[$each_record['id']];
    }

    /* 
        here I unset every key which wasn't at root level,i.e is 0(top) level
    */
    foreach($hierarchy as $parent => $its_data){
        if($parent != ROOT_PARENT){
            unset($hierarchy[$parent]);
        }
    }

    return isset($hierarchy[ROOT_PARENT],$hierarchy[ROOT_PARENT]['child']) ? $hierarchy[ROOT_PARENT]['child'] : [];
}

$records = [
            [
                "id" => 20,
                "name" => "a",
                "parent" => 28,
            ],
            [
                "id" => 21,
                "name" => "a-child",
                "parent" => 20,
            ],
            [
                "id" => 27,
                "name" => "a-child-b",
                "parent" => 20,
            ],
            [
                "id" => 28,
               "name" => "A parent",
               "parent" => 0,
            ],
            [
                "id" => 12,
                "name" => "no parent",
                "parent" => 0,
            ]
    ];


echo "<pre>";
print_r(getHierarchy($records));

输出:

Array
(
    [0] => Array
        (
            [id] => 28
            [name] => A parent
            [parent] => 0
            [child] => Array
                (
                    [0] => Array
                        (
                            [id] => 20
                            [name] => a
                            [parent] => 28
                            [child] => Array
                                (
                                    [0] => Array
                                        (
                                            [id] => 21
                                            [name] => a-child
                                            [parent] => 20
                                            [child] => Array
                                                (
                                                )

                                        )

                                    [1] => Array
                                        (
                                            [id] => 27
                                            [name] => a-child-b
                                            [parent] => 20
                                            [child] => Array
                                                (
                                                )

                                        )

                                )

                        )

                )

        )

    [1] => Array
        (
            [id] => 12
            [name] => no parent
            [parent] => 0
            [child] => Array
                (
                )

        )

)

首先,我们认为每个人都可以是父母。然后,在它的父母的child钥匙中,我们继续添加它的孩子。key由于可能会有未来的孩子,我们通过了引用。最后,unset()来自层次结构的不是根父级的每个人。最后,您将拥有最终的层次结构。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

当我不知道其中有多少个文本框时,应该如何处理多个文本框?

当您不知道用户将输入多少个单词时,如何动态分配二维数组?

合并/结合(不知道我需要?)PHP的数组,如果按键[任何] [0]是相同的数

分配数组后如何知道数组中有多少个插槽?

PHP搜索多维数组。不知道钥匙

使用explode(php)向数据库中添加多个(不知道有多少个)单词

如果我不知道每个列表中有多少个数字,如何将给定数量的数字列表作为输入?

当您不知道将有多少个嵌套 JSON 对象时,如何为每个级别生成 Vue 组件?

如何在不知道C ++中有多少个可选参数的情况下在循环中使用va_arg?

查找数组中有多少个连续数字[java]

NodeJS计数数组中有多少个对象?

计算数组中有多少个元素

数组中有多少个偶数整数(Python)

数组中有多少个奇数和偶数

指针数组中有多少个指针

PHP如何将值相同的多维数组分组

PHP需要计算数组中有多少个特定值的实例

加载 csv 文件,其中有一列将 numpy 数组写为字符串

如果我不知道他们的ID,如何检查选中了多少个复选框

从一个准备好的语句中进行许多php mysqli查询,却不知道有多少个参数

Javascript返回一个空数组,但其中有两个元素

如何投多维数组不知道尺寸在Java中

是否可以在Azure管道中运行“最终阶段”而不知道总共有多少个阶段?

定位父元素,但不知道子元素和父元素之间有多少个节点

JavaScript通过计数对象(不知道有多少个对象)来拆分JSON字符串

当您不知道有多少个整数时,如何从char字符串中读取整数?(在C中)

Javascript在不知道所有键的情况下访问多维数组

多个不同的数组,其中有空值

将数组分组为一个