二维数组根据 pid 以及 id 变为无限极分类状的数组

if (!function_exists('pr')) {
    /**
     * 测试用打印函数
     * @param array $arr
     */
    function pr($arr)
    {
        if ($arr) {
            echo '<pre>';
            print_r($arr);
            echo '</pre>';
        } else {
            echo 'pr数组为空!';
        }
    }

}

将要转化的数组

$arr = [
    ['id'=>1,'pid'=>0,'name'=>'a'],
    ['id'=>2,'pid'=>1,'name'=>'b'],
    ['id'=>3,'pid'=>1,'name'=>'c'],
    ['id'=>4,'pid'=>2,'name'=>'d'],
    ['id'=>5,'pid'=>2,'name'=>'e'],
    ['id'=>6,'pid'=>3,'name'=>'f'],
    ['id'=>7,'pid'=>3,'name'=>'g'],
];

代码:

function list_to_tree($list) {
    $tree = array();// 创建Tree
    if(is_array($list)) {
        // 创建基于主键的数组引用
        $refer = array();
        foreach ($list as $key => $data) {
            $refer[$data['id']] = &$list[$key];
        }
        foreach ($list as $key => $data) {
            // 判断是否存在parent
            $parentId = $data['pid'];
            if (0 == $parentId) {
                $tree = &$list[$key];
            }else{
                if (isset($refer[$parentId])) {
                    $parent = &$refer[$parentId];
                    $parent['children'][] = &$list[$key];
                }
            }
        }
    }
    return $tree;
}
$tree = list_to_tree($arr);

到这一步就可以了,但是今天遇见一家公司的面试题,要求去除所有 pid,所以自己有进一步做了一件事情

function jPid(&$tree){
    unset($tree['pid']);
    if(isset($tree['children'])){
        foreach($tree['children'] as $k=>$v){
            jPid($tree['children'][$k]);
        }
    }
    return $tree;
}
$tree = jPid($tree);
pr($tree);

输出

Array
(
    [id] => 1
    [name] => a
    [children] => Array
        (
            [0] => Array
                (
                    [id] => 2
                    [name] => b
                    [children] => Array
                        (
                            [0] => Array
                                (
                                    [id] => 4
                                    [name] => d
                                )

                            [1] => Array
                                (
                                    [id] => 5
                                    [name] => e
                                )

                        )

                )

            [1] => Array
                (
                    [id] => 3
                    [name] => c
                    [children] => Array
                        (
                            [0] => Array
                                (
                                    [id] => 6
                                    [name] => f
                                )

                            [1] => Array
                                (
                                    [id] => 7
                                    [name] => g
                                )

                        )

                )

        )

)

转化为 json 输出

{
    "id": 1,
    "name": "a",
    "children": [
        {
            "id": 2,
            "name": "b",
            "children": [
                {
                    "id": 4,
                    "name": "d"
                },
                {
                    "id": 5,
                    "name": "e"
                }
            ]
        },
        {
            "id": 3,
            "name": "c",
            "children": [
                {
                    "id": 6,
                    "name": "f"
                },
                {
                    "id": 7,
                    "name": "g"
                }
            ]
        }
    ]
}
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Joker_PL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值