ThinkPHP 无限极分类生成栏目树

ThinkPHP 无限极分类,在页面生成导航条数据,或者栏目列表树的情景是非常有用的,下面介绍2中方法生成:

方法1:

/**
 * 递归方式获取树状列表
 * @param array $data 数组中子元素必须含有id、pid字段
 * @param int $pid
 * @param string $dataid
 * @param int $level
 * @return array
 */
public static function menuTree(array $data, int $pid = 0, string $dataid = 'id', int $level = 1)
{
    static $arr = [];
    foreach ($data as $k => $v) {
        if ($v['pid'] == $pid) {
            $v['level'] = $level;
            $v['dataid'] = $dataid . '-' . $v['id'];
            $arr[] = $v;
            self::menuTree($data, $v['id'], $v['dataid'], $level + 1);
        }
    }
    return $arr;
}

方法2:

/**
 * 获取栏目树
 * @param array $data 数组中子元素必须含有id、pid字段
 * @return array
 */
public static function getTree(array $data)
{
    $items = [];
    foreach ($data as $v) {
        $items[$v['id']] = $v;
    }
    $tree = [];
    foreach ($items as $id => $item) {
        if (isset($items[$item['pid']])) {
            $items[$item['pid']]['list'][] = &$items[$id];
        } else {
            $tree[] = &$items[$id];
        }
    }
    return $tree;
}


使用方法:

先获取数据库中列表数据

$data = CategoryModel::order('id', 'asc')->select();

在调用方法生成:

$category = self::getTree($data->toArray()); //$data传入时转成数组