欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  php教程

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

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

1、在修改和新增栏目成功的时候生成缓存文件,在模板中使用缓存/*更新缓存文件*/
$map['topid'] = 0;
$map['yiyuanid'] = $this->_get('yiyuanid');
$other['order'] = 'sort desc,keshi.id asc';
$other['field'] = 'keshi.*,yiyuan.name as yiyuan';
$other['join'] = 'yiyuan on yiyuan.id=keshi.yiyuanid';
$digui = digui('keshi',$map,$other);
S('keshi',$digui);//缓存数据
2、核心的三个递归函数/*
* 递归数据,递归成多维数组,childs存储下级,生产环境中请把返回值进行缓存,这样只查库一次,可以在新增和更新的方法处再调用这个函数更新缓存
* @param string $table 查询的表名
* @param array $where 查询的where条件
* @param array $other 其它查询需要的变量
* @return array $list 一个表示层级关系的多维数组
*/
function digui($table,$where,$other){
$Form = M($table);
if($other['join']){
$list = $Form->field($other['field'])->join($other['join'])->where($where)->order($other['order'])->select();
}else{
$list = $Form->field($other['field'])->where($where)->order($other['order'])->select();
}
foreach ($list as $k => $v) {
if($digui = digui($table,array('topid'=>$v['id']),$other)){
$list[$k]['childs'] = $digui;//递归子类
}
}
return $list;
}

/*
* 读取递归数据的函数,使用前请把digui()函数的返回值进行缓存
* @param array $list 这个参数是S('keshi')读取过来的层级关系的多维数组,是由digui()产生的
* @return void 无返回值直接输出
*/
function KeshiType($list){
foreach ($list as $k => $v) {
echo ' '.$v['id'].' '.$v['yiyuan'].' '.$v['name'].' 编辑  编辑  编辑  删除 ';
KeshiTypeSeed($v['childs']);
}
}
/*
* 楼上KeshiType的子函数配合递归
*/
function KeshiTypeSeed($list){
if($list){
echo '';
foreach ($list as $k => $v) {
echo '';
KeshiTypeSeed($v['childs']);
}
echo '
'.$v['id'].' '.$v['yiyuan'].' '.$v['name'].' 编辑  管理2  管理  删除
';
}
}
3、在模板中使用缓存进行递归栏目/我增加了点击展开关闭栏目的jquery代码,

//模板递归的部分

$keshis = S('keshi');//读取缓存
KeshiType($keshis);//递归输出数据

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