/**
* 引用无限分类
* @param array $list
* @param string $pIdkey
* @return array
*/
function generateTree(array $list, $pIdkey = 'pid')
{
$items = [];
foreach ($list as $v) {
$items[$v['id']] = $v;
$items[$v['id']]['children'] = [];
}
$tree = [];
foreach ($items as &$item) {
if (isset($items[$item[$pIdkey]])) {
$items[$item[$pIdkey]]['children'][] = &$item;
} else {
$tree[] = &$item;
}
}
unset($item);
return $tree;
}
/**
* 递归生成树形结构数组
*
* @param array $list 原始列表数据
* @param integer $pId 父节点ID,默认为0
* @param integer $level 当前层级,默认为0
* @return array 树形结构数组
*/
function generateTree2(array $list, $parentId = 0, $level = 0)
{
$tree = [];
foreach ($list as $key => $item) {
// 找到当前层级的子节点
if ($item['pid'] == $parentId ) {
$item['level'] = $level;
unset($list[$key]); // 从原始列表中移除当前节点,减少后续的遍历次数
$item['children'] = generateTree2($list, $item['id'], $level + 1); // 递归调用,生成子节点的树形结构
$tree[] = $item;
}
}
return $tree;
}
/**
* 无限分类之菜单栏引用和递归(传入父级pid)
* @param $list 二维数组
* @param string $pid 父级pid,默认空
* @param string $pk 默认key:'pid'
* @param array $arr
* @return array
*/
function generateTree($list, $pid = '', $pk = 'pid', &$arr = array())
{
$items = [];
foreach ($list as $v) {
$items[$v['id']] = $v;
$items[$v['id']]['children'] = [];
}
$tree = [];
foreach ($items as $key => &$item) {
if (is_numeric($pid)) {
if ($item[$pk] == $pid) {
// echo '递归';
if (isset($items[$item['id']])) {
$item['children'] = generateTree($list, $item['id'], $pk, $arr);
}
$tree[] = &$item;
}
} else {
if (isset($items[$item[$pk]])) {
// echo '引用';
$items[$item[$pk]]['children'][] = &$item;
} else {
$tree[] = &$item;
}
}
}
unset($item);
return $tree;
}
Array
(
[0] => Array
(
[id] => 114
[name] => 一级分类
[pid] => 0
[children] => Array
(
[0] => Array
(
[id] => 125
[name] => 二级分类
[pid] => 114
[children] => Array
(
[0] => Array
(
[id] => 171
[name] => 三级分类
[pid] => 125
)
)
)
[1] => Array
(
[id] => 126
[name] => 二级分类
[pid] => 114
)
)
)
[1] => Array
(
...省略
)
...省略
)
/**
* 无限分类之面包屑导航(传入子级id)
* @param array $data 二维数组
* @param int $id 子级id
* @param array $arr
* @return array
*/
function getSonToLinkAAABBB(array $data, int $id, array &$arr = []): array
{
foreach ($data as $value) {
//这里只会找父级
if ($value['id'] == $id) {
//这里会一直找到最顶级
getSonToLinkAAABBB($data, $value['pid'], $arr);
$arr[] = $value; //从最顶级开始插入数据,再跳出当前级别递归,往外级递归继续插入。
}
}
return $arr;
}
array(2) {
[0] => array(3) {
["id"] => int(2)
["pid"] => int(0)
["city"] => string(6) "广东"
}
[1] => array(3) {
["id"] => int(6)
["pid"] => int(2)
["city"] => string(6) "深圳"
}
}
网友评论