php无限极分类 2023-02-23

2023-02-22  本文已影响0人  阿然学编程
/**
 * 引用无限分类
 * @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) "深圳"
  }
}
上一篇 下一篇

猜你喜欢

热点阅读