首页  >  文章  >  php教程  >  ThinkPHP使用缓存解决递归问题,只查库一次

ThinkPHP使用缓存解决递归问题,只查库一次

WBOY
WBOY原创
2016-06-07 11:44:481370浏览

基本思路是先用递归把栏目整成多维数组,并缓存之。多维数组表示一级一级的,然后输出的时候再用递归把多维数组循环输出出来,另外我写了JQUERY代码,可以展开关闭子分类
前天哥哥写了个递归,发现查库次数太多,所以修改了一下,现在只查库一次了,有问题的发我邮箱交流 576272452@qq.com,没代码没真相,下面上代码

1、在修改和新增栏目成功的时候生成缓存文件,在模板中使用缓存/*更新缓存文件*/<br> $map['topid'] = 0;<br> $map['yiyuanid'] = $this->_get('yiyuanid');<br> $other['order'] = 'sort desc,keshi.id asc';<br> $other['field'] = 'keshi.*,yiyuan.name as yiyuan';<br> $other['join'] = 'yiyuan on yiyuan.id=keshi.yiyuanid';<br> $digui = digui('keshi',$map,$other);<br> S('keshi',$digui);//缓存数据2、核心的三个递归函数/*<br> * 递归数据,递归成多维数组,childs存储下级,生产环境中请把返回值进行缓存,这样只查库一次,可以在新增和更新的方法处再调用这个函数更新缓存<br> * @param string $table 查询的表名<br> * @param array $where 查询的where条件<br> * @param array $other 其它查询需要的变量<br> * @return array $list 一个表示层级关系的多维数组<br> */<br> function digui($table,$where,$other){<br>     $Form = M($table);<br>     if($other['join']){<br>         $list = $Form->field($other['field'])->join($other['join'])->where($where)->order($other['order'])->select();<br>     }else{<br>         $list = $Form->field($other['field'])->where($where)->order($other['order'])->select();<br>     }<br>     foreach ($list as $k => $v) {<br>         if($digui = digui($table,array('topid'=>$v['id']),$other)){<br>             $list[$k]['childs'] = $digui;//递归子类<br>         }        <br>     }<br>     return $list;<br> }<br>     <br> /*<br> * 读取递归数据的函数,使用前请把digui()函数的返回值进行缓存<br> * @param array $list 这个参数是S('keshi')读取过来的层级关系的多维数组,是由digui()产生的<br> * @return void 无返回值直接输出<br> */<br> function KeshiType($list){<br>     foreach ($list as $k => $v) {<br>          echo '<tr> <td> <span></span>'.$v['id'].'</td> <td>'.$v['yiyuan'].'</td> <td>'.$v['name'].'</td> <td> <span>编辑</span>  <span>编辑</span>  <a>编辑</a>  <a>删除</a> </td> </tr>';<br>          KeshiTypeSeed($v['childs']);<br>      } <br> }<br> /*<br> * 楼上KeshiType的子函数配合递归<br> */   <br> function KeshiTypeSeed($list){<br>     if($list){<br>         echo '<tr><td><table>';<br>         foreach ($list as $k => $v) {<br>              echo '<tr> <td> <span></span>'.$v['id'].'</td> <td>'.$v['yiyuan'].'</td> <td>'.$v['name'].'</td> <td> <span>编辑</span>  <span>管理2</span>  <a>管理</a>  <a>删除</a> </td> </tr>';<br>              KeshiTypeSeed($v['childs']);<br>          }<br>         echo '</table></td></tr>';<br>     }<br> }3、在模板中使用缓存进行递归栏目/我增加了点击展开关闭栏目的jquery代码,<br> <script><br /> /*<br /> * 点击展开子类<br /> *<br /> */<br /> $(".jia").click(function(){<br /> if($(this).parent("td").parent("tr").next(".seed").is(":hidden")){<br /> $(this).parent("td").parent("tr").next(".seed").show();<br /> $(this).html("-");<br /> }else{<br /> $(this).parent("td").parent("tr").next(".seed").hide();<br /> $(this).html("+"); <br /> }<br /> <br /> });<br /> <br /> $(".seed").prev(".fid").find("td").find("span.jia").html("-");<br /> <br /> /*<br /> * 点击关闭所有子类<br /> *<br /> */<br /> $("#closeseed").click(function(){<br /> if($(this).val() == "展开所有子类"){<br /> $(".seed").show();<br /> $(this).val("关闭所有子类");<br /> $.each($(".jia"),function(k,v){<br /> if($(this).html()){<br /> $(this).html("-");<br /> }<br /> }); <br /> }else{<br /> $(".seed").hide();<br /> $(this).val("展开所有子类");<br /> $.each($(".jia"),function(k,v){<br /> if($(this).html()){<br /> $(this).html("+");<br /> }<br /> }); <br /> } <br /> });<br /> <br /> });<br /> </script><br> //模板递归的部分 <br> <php><br>     $keshis = S('keshi');//读取缓存<br>     KeshiType($keshis);//递归输出数据<br>  </php>

AD:真正免费,域名+虚机+企业邮箱=0元

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn