有什么好用的无限分类吗

有什么好用的无限分类吗 可设置获取第几级菜单,是树桩结构,比如获取二级菜单,结构就是三维数组:
array(
0 => array(
'name' => test,
'childs' =>array()
)
)

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
jcc123
最佳答案

@张无忌 那就加个级别限制咯~

function getTree($arrs,$root=0,$level=100)
{
    $tree = array();
    foreach ($arrs as $foo) {
        if ($foo['parent_id'] == $root) {

           if($level>0){               
            $foo['children'] = getTree($arrs,$foo['id'],$level-1);     
           }
            $tree[] = $foo;

        }
    }
    --$level;
    return $tree;
}

var_export($arrs,0,0)//一级

array (
  0 => 
  array (
    'id' => 1,
    'parent_id' => 0,
  ),
  1 => 
  array (
    'id' => 5,
    'parent_id' => 0,
  ),
)

var_export($arrs,0,1)//两级

array (
  0 => 
  array (
    'id' => 1,
    'parent_id' => 0,
    'children' => 
    array (
      0 => 
      array (
        'id' => 2,
        'parent_id' => 1,
      ),
    ),
  ),
  1 => 
  array (
    'id' => 5,
    'parent_id' => 0,
    'children' => 
    array (
      0 => 
      array (
        'id' => 6,
        'parent_id' => 5,
      ),
    ),
  ),
)
4年前 评论
讨论数量: 11

使用模型自带关联关系可以实现无限级

    /**
     * 返回子节点
     * @return \Illuminate\Database\Eloquent\Relations\HasMany
     */
    public function children()
    {
        return $this->hasMany(get_class($this),'p_id','id');
    }

    /**
     * 所有子节点
     * @return \Illuminate\Database\Eloquent\Relations\HasMany
     */
    public function allChildren()
    {
        return $this->children()->with( 'allChildren' );
    }

    /**
     * 父节点
     * @return \Illuminate\Database\Eloquent\Relations\HasOne
     */
    public function parent()
    {
        return $this->hasOne(get_class($this),'id','p_id');
    }
4年前 评论

@张无忌 多级无限分类的数据库结构

4年前 评论
jcc123

简单粗暴了点~

$arrs = [
    [
        'id'=>1,
        'parent_id'=>0
    ],
    [
        'id'=>2,
        'parent_id'=>1
    ],
    [
        'id'=>3,
        'parent_id'=>2
    ],
    [
        'id'=>4,
        'parent_id'=>2
    ],
    [
        'id'=>5,
        'parent_id'=>0
    ],
];
var_export(getTree($arrs));
function getTree($arrs,$root=0)
{
    $tree = array();
    foreach ($arrs as $foo) {
        if ($foo['parent_id'] == $root) {
            $foo['children'] = getTree($arrs,$foo['id']);
            $tree[] = $foo;
        }
    }
    return $tree;
}

输出

array (
  0 => 
  array (
    'id' => 1,
    'parent_id' => 0,
    'children' => 
    array (
      0 => 
      array (
        'id' => 2,
        'parent_id' => 1,
        'children' => 
        array (
          0 => 
          array (
            'id' => 3,
            'parent_id' => 2,
            'children' => 
            array (
            ),
          ),
          1 => 
          array (
            'id' => 4,
            'parent_id' => 2,
            'children' => 
            array (
            ),
          ),
        ),
      ),
    ),
  ),
  1 => 
  array (
    'id' => 5,
    'parent_id' => 0,
    'children' => 
    array (
    ),
  ),
)
4年前 评论
张无忌

@jcc123 如果只要一级和二级分类的树状结构呢

4年前 评论
jcc123

@张无忌 那就加个级别限制咯~

function getTree($arrs,$root=0,$level=100)
{
    $tree = array();
    foreach ($arrs as $foo) {
        if ($foo['parent_id'] == $root) {

           if($level>0){               
            $foo['children'] = getTree($arrs,$foo['id'],$level-1);     
           }
            $tree[] = $foo;

        }
    }
    --$level;
    return $tree;
}

var_export($arrs,0,0)//一级

array (
  0 => 
  array (
    'id' => 1,
    'parent_id' => 0,
  ),
  1 => 
  array (
    'id' => 5,
    'parent_id' => 0,
  ),
)

var_export($arrs,0,1)//两级

array (
  0 => 
  array (
    'id' => 1,
    'parent_id' => 0,
    'children' => 
    array (
      0 => 
      array (
        'id' => 2,
        'parent_id' => 1,
      ),
    ),
  ),
  1 => 
  array (
    'id' => 5,
    'parent_id' => 0,
    'children' => 
    array (
      0 => 
      array (
        'id' => 6,
        'parent_id' => 5,
      ),
    ),
  ),
)
4年前 评论
/**
     * 把返回的数据集转换成Tree
     *
     * @param $list
     * @param string $pk
     * @param string $pid
     * @param string $child
     * @param int $root
     * @return array
     */
    public static function list_to_tree($list, $pk = 'id', $pid = 'pid', $child = '_child', $root = 0)
    {
        // 创建Tree
        $tree = [];
        if (is_array($list)) {
            // 创建基于主键的数组引用
            $refer = [];
            foreach ($list as $key => $data) {
                $refer[$data[$pk]] = &$list[$key];
            }
            foreach ($list as $key => $data) {
                // 判断是否存在parent
                $parentId = $data[$pid];
                if ($root == $parentId) {
                    $tree[] = &$list[$key];
                } else {
                    if (isset($refer[$parentId])) {
                        $parent = &$refer[$parentId];
                        $parent[$child][] = &$list[$key];
                    } else {
                        $tree[] = &$list[$key];
                    }
                }
            }
        }
        return $tree;
    }
4年前 评论
Epona

试试这个 Laravel-nestedset

4年前 评论

使用模型自带关联关系可以实现无限级

    /**
     * 返回子节点
     * @return \Illuminate\Database\Eloquent\Relations\HasMany
     */
    public function children()
    {
        return $this->hasMany(get_class($this),'p_id','id');
    }

    /**
     * 所有子节点
     * @return \Illuminate\Database\Eloquent\Relations\HasMany
     */
    public function allChildren()
    {
        return $this->children()->with( 'allChildren' );
    }

    /**
     * 父节点
     * @return \Illuminate\Database\Eloquent\Relations\HasOne
     */
    public function parent()
    {
        return $this->hasOne(get_class($this),'id','p_id');
    }
4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!