ThinkPHP 无限递归

无限递归

其中 pid 的所属父级的 id

1.第一种

    public function getcatebypid($pid)
    {
        $data = Db::table("cates")->where("pid", $pid)->select();
        $res  = [];
        //遍历 递归
        foreach ($data as $key => $value) {
            // 代码段:核心点
            $value['shop'] = $this->getcatebypid($value['id']);
            $res[]         = $value;
        }
        return $res;
    }

调用$this->getcatebypid(0);

2.第二种

function getList($brr, $pid = 0, &$arr = [], $level = 1)
{
    foreach ($brr as $v) {
        if ($v['pid'] == $pid) {
            $v['level'] = $level;
            $arr[]      = $v;
            getList($brr, $v['id'], $arr, $level + 1);
        }
    }
    return $arr;
}

调用getList(db("user)->select(),$user['role_id']);

页面处理{:str_repeat('|——',$vo.level)}{$vo.name} 适用于第二种方法

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 3
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年前 评论
lmaster 4年前
lmaster 4年前
wml_macho (楼主) 4年前
cnguu
  • 首先,赞扬学习分享精神
  • 其次,标题有错别字
  • 最后,批评 Markdown 排版,有待改进
4年前 评论
wml_macho (楼主) 4年前
迟早被自己骚死 4年前
lmaster

@wml123 方法 2 中性能损失严重

function getList($brr, $pid = 0, &$arr = [], $level = 1)
{
    foreach ($brr as $v) {
        if ($v['pid'] == $pid) {
            $v['level'] = $level;
            $arr[]      = $v;
            getList($brr, $v['id'], $arr, $level + 1);// 损失点
        }
    }
    return $arr;
}

假设,$brr体量是 n,那就要循环 n*(n+1) 次。

4年前 评论
wml_macho (楼主) 4年前

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