php 无级别递归调用树形菜单结构

无级别递归调用,应用场景:菜单列表。如有父级,归属父级下,无归属父级。展示为父级

public function test() {
        $dataList = [
            ['parent_id' => '0', 'id' => '1', 'title' => '父1'],
            ['parent_id' => '3', 'id' => '2', 'title' => '孙4-4'],
            ['parent_id' => '4', 'id' => '3', 'title' => '子4-3'],
            ['parent_id' => '0', 'id' => '4', 'title' => '父4'],
        ];
        $new_level = [];
        foreach ($dataList as $v) {
            $tmp_level = $this->buildLevel($v, $new_level);
            $new_level = $tmp_level['data'];
            if (!empty($tmp_level['tmp'])) {
                $new_level[] = $tmp_level['tmp'];
            }
        }
        print_r($new_level);
    }
    public function buildLevel($target, $source) {
        $target['children'] = [];
        $rtn_data = [];
        $source_data = $source;
        $find = false;
        $parent_key = 0;
        $find_parent = false;
        $find_child = false;
        $children_data = [];
        foreach ($source as $k => $v) {
            if ($v['id'] == $target['parent_id']) {
                $find_parent = true;
                $find = true;
                $parent_key = $k;
            } else if ($v['parent_id'] == $target['id']) {
                $target['children'][] = $v;
                unset($source_data[$k]);
                $find_child = true;
                $find = true;
            } else if (!empty($v['children'])) {
                $tmp = $this->buildLevel($target, $v['children']);
                $source_data[$k]['children'] = $tmp['data'];
                if (empty($tmp['tmp'])) {
                    $find = true;
                }
            }
        }
        if ($find_parent) {
            $source_data[$parent_key]['children'][] = $target;
        } else if ($find_child) {
            $source_data[] = $target;
        }
        $rtn_data['data'] = $source_data;
        if (!$find) {
            $rtn_data['tmp'] = $target;
        }
        return $rtn_data;
    }

输出结果:

Array
(
    [0] => Array
        (
            [parent_id] => 0
            [id] => 1
            [title] => 父1
            [children] => Array
                (
                )

        )

    [3] => Array
        (
            [parent_id] => 0
            [id] => 4
            [title] => 父4
            [children] => Array
                (
                    [0] => Array
                        (
                            [parent_id] => 4
                            [id] => 3
                            [title] => 子4-3
                            [children] => Array
                                (
                                    [0] => Array
                                        (
                                            [parent_id] => 3
                                            [id] => 2
                                            [title] => 孙4-4
                                            [children] => Array
                                                (
                                                )

                                        )

                                )

                        )

                )

        )

)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值