thinkphp - php无限分类求改造 速度极慢

 叶葳蕤1095190287 发布于 2022-12-01 01:30

我知道我这么写 是很慢的
我知道思路 但是做不出来
应该一次性将所有数据取出来
然后排序 求赐教

        function getBookmarkcategory($pid = 0, &$result = array(), $spac = 0)
        {
            if(MODULE_NAME=="Home"){
                $ispublic=0;
                $uid=session('uid');
                $ispublic+="And bookmarkcategory_staffid = $uid";

            }else if(MODULE_NAME=="Admin"){
                $ispublic=1;
            }

            $Model = new Model();
            $spac = $spac + 8;
            $res=$Model->query( "SELECT * FROM x_bookmarkcategory WHERE bookmarkcategory_pid=$pid And bookmarkcategory_ispublic = $ispublic order by bookmarkcategory_sort");
            foreach($res as $key=>$value){
                $result[]=$res[$key];
                getBookmarkcategory($value['bookmarkcategory_id'],$result,$spac);
            }
            return $result;
        }
        $list = getBookmarkcategory();

        return $list;
9 个回答
  • 不说需求,表结构,谁知道那么一坨代码是干吗用的

    2022-12-01 02:05 回答
  • php无限分类 一种算法 可以参考 PHPCMS category 表结构。它是把所有的父(树)结点与子(树)结点都递归存入数据库。可以一次记取存所有数据到数组再递归。

    2022-12-01 02:05 回答
  • 可以参考下面问题的答案,“分类”和权限管理中的部门类似
    http://segmentfault.com/q/1010000004365843/a-1020000004365952

    2022-12-01 02:05 回答
  •             $res=$Model->query( "SELECT * FROM x_bookmarkcategory WHERE bookmarkcategory_pid=$pid And bookmarkcategory_ispublic = $ispublic order by bookmarkcategory_sort");
    

    应该是慢在这里,完全可以想办法不要放到递归里面查询,先一次性查询出来,然后递归也比这个快N倍啊

    2022-12-01 02:05 回答
  • function getBookmarkcategory($pid = 0, &$result = array(), $spac = 0)
            {
                if(MODULE_NAME=="Home"){
                    $ispublic=0;
                    $uid=session('uid');
                    $ispublic+="And bookmarkcategory_staffid = $uid";
    
                }else if(MODULE_NAME=="Admin"){
                    $ispublic=1;
                }
    
                $Model = new Model();//竟然是递归 每次寻环 都要实例模型  慢的原因 之一 放到函数外面
                $spac = $spac + 8;
                $res=$Model->query( "SELECT * FROM x_bookmarkcategory WHERE bookmarkcategory_pid=$pid And bookmarkcategory_ispublic = $ispublic order by bookmarkcategory_sort");
                //SELECT *   这种写法 性能低 bookmarkcategory_pid=$pid--bookmarkcategory_pid 是否索引 
                foreach($res as $key=>$value){
                    $result[]=$res[$key];
                    getBookmarkcategory($value['bookmarkcategory_id'],$result,$spac);
                }
                return $result;
            }
            //速度最好的是 数据一次在外部取出 再来递归 很快 mysql 操作很慢的
    2022-12-01 02:05 回答
  • 一次查询查出所有,然后循环,使用传值引用调整数据结构,然后就出来了

    2022-12-01 02:38 回答
  • 可以用左右值树
    http://wenku.baidu.com/view/cb2bb3eeaeaad1f346933ffd.html

    效率非常高

    2022-12-01 02:38 回答
  • 可以用数据字典做,一次性拿出全部数据,再循环一次即可

    2022-12-01 02:38 回答
  • 因为你在不停地从外部存储读取数据。如果数据量不大,一次性可以把所有需要的数据读取出来,然后在内存中构造树。哪些是需要的数据在数据生成的时候就可以把关联表保存下来。如果数据量非常大,可以考虑按树的层级存储关联数据,分几次读取。
    PS: 看你的代码里,要小心SQL注入

    2022-12-01 02:38 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有