• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

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

php 搞代码 4年前 (2022-01-25) 28次浏览 已收录 0个评论
文章目录[隐藏]

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

<code>        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;</code>

回复内容:

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

<code>        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;</code>

不说需求,表结构,谁知道那么一坨代码是干吗用的

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

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

<code>            $res=$Model->query( "SELECT<strong>2本文来源gaodaima#com搞(代@码$网6</strong><pre>搞gaodaima代码

* FROM x_bookmarkcategory WHERE bookmarkcategory_pid=$pid And bookmarkcategory_ispublic = $ispublic order by bookmarkcategory_sort”);

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

<code>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 操作很慢的</code>

一次查询查出所有,然后循环,使用传值引用调整数据结构,然后就出来了

可以用左右值树
http://wenku.baidu.com/view/cb2bb3eeaeaad1f346933ffd.html

效率非常高

可以用数据字典做,一次性拿出全部数据,再循环一次即可

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


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:thinkphp无限分类求改造 速度极慢

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址