树桩无限极递归分类

思路:
将有关联的数据放进去
如果pid=0的那就顶级分类
将leve也分成0 也就是最高级

将新数组保存 销毁该次节点 减少递归消耗
如果是子分类就将lev+1 进入下一次递归
知道递归完全部数据

<?php
namespace app\api\controller\v3;
use think\Controller;
Class Index extends controller
{

    public function tree()
    {
        $array = [

            ['id'=>'1',
            'pid'=>'0',
            'name'=>'php'
            ],

            ['id'=>'2',
            'pid'=>'1',
            'name'=>'数据类型'
            ],
            ['id'=>'10',
            'pid'=>'2',
            'name'=>'数据类型-》布尔型'],
            ['id'=>'3',
            'pid'=>'1',
            'name'=>'遍历'
            ],
            ['id'=>'4',
            'pid'=>'0',
            'name'=>'java'],
            ['id'=>'5',
            'pid'=>'4',
            'name'=>'java儿子'],
            ['id'=>19,
            'pid'=>5,
            'name'=>'pyaaa'],
            ];
            //分好等级层次
            $data = $this->_infinite($array);
            //根据等级层次生成树桩
            // echo "<pre>";print_r($data);echo "<pre>";

            return $this->_show_tree($data);

    }
public function _show_tree($_data) {
    $_html = '';
    foreach ($_data as $_key => $_value) {
        if ($_value['level'] > 0) {
            $_prefix = '|' . str_repeat('--', $_value['level']);
        } else {
            $_prefix = '';
        }

        $_html .= $_prefix . '<a href="###">' . $_value['name'] . '</a><br />';
    }

    return $_html;
}

public function _infinite($_data, $_pid = 0, $_level = 0) {
    // 定义静态变量,防止每次都初始化
    static $_new_data = [];

    // 循环,得出每个数据对应的层级
    foreach ($_data as $_key => $_value) {
        // 第一次遍历,找到父节点为根节点的节点,即:pid = 0
        if ($_value['pid'] == $_pid) {
            // 当该节点为根节点时,对应的层级设为 0,即:level = 0
            $_value['level'] = $_level;
            // 把该节点放入数组中
            $_new_data[] = $_value;
            // 得出节点层级后,删除该节点,减少递归的消耗
            unset($_data[$_key]);
            // 开始递归,查找所有 pid 为当前节点 id 的数据,层级加 1,作为对应的子节点
            $this->_infinite($_data, $_value['id'], $_level + 1);
        }
    }

    // 返回带层级的新数组
    return $_new_data;
}

}

为您推荐

评论已关闭