思路:
将有关联的数据放进去
如果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;
}
}
评论已关闭