php tp无限分类,thinkphp实现无限分类(使用递归)

本文实例为大家分享了thinkphp实现无限分类的详细代码,希望对大家学习无限分类有所启发。

数据库:test

数据表:(tp_category):

e6350617678d1e9584695c559d136121.png

Common/conf/config.php

'DB_CONFIG2' => array(

'db_type' => 'mysql',

'db_user' => 'root',

'db_pwd' => '',

'db_host' => 'localhost',

'db_port' => '3306',

'db_name' => 'test',

'DB_PREFIX' => 'tp_', // 数据库表前缀

'DB_CHARSET'=> 'utf8', // 字符集

'DB_DEBUG' => TRUE, // 数据库调试模式 开启后可以记录SQL日志 3.2.3新增

),

Common/function.php 遍历函数loop

/*

* 递归遍历

* @param $data array

* @param $id int

* return array

* */

function recursion($data, $id=0) {

$list = array();

foreach($data as $v) {

if($v['pid'] == $id) {

$v['son'] = recursion($data, $v['id']);

if(empty($v['son'])) {

unset($v['son']);

}

array_push($list, $v);

}

}

return $list;

}

Controller/IndexController.class.php

public function test() {

$category = M('category', '', C('DB_CONFIG2'))->select();

$result = loop($category);

var_dump($result);

$this->assign('list', $result);

$this->display();

}

在模板(View/Index/test.html)中输出(仅支持2级分类,如果想全部显示,建议先把数组转换成JSON格式,然后通过AJAX请求,JS生成)

  • {$vo.category}

    • {$cate.category}

后续(ajax请求,递归显示所有分类):

b888db7e353716a561caefe5d665e401.png

方法 Controller/IndexController.class.php

public function test() {

$this->display();

}

public function resultCategory() {

$category = M('category', '', C('DB_CONFIG2'))->select();

$result = loop($category);

$this->ajaxReturn(array('data'=>$result,'status'=>'1','info'=>'获取列表成功'));

}

模板View/Index/test.html

分类测试

$(function() {

// 递归列表函数

function recursion(selector,data)

{

if(!data) return false;

for(var i=0;i

{

var li=$('

'+data[i]['category']+'');

if(data[i]['children'] && data[i]['children'].length>0)

{

var ul=$('

recursion(ul,data[i]['children']);

li.append(ul);

}

selector.append(li);

}

}

// ajax请求 用$.post() 会更方便

$.ajax({

url: "{:U('resultCategory')}",

type: 'post',

dataType: 'json',

error: function(res) {

console.log(res);

},

success: function(res) {

recursion($('#menu'),res['data']);

console.log(res['data']);

}

});

});

另一种无限级分类:

7f596d97dfbde96010d5d78ae90ced75.png

/**

* 无限极分类

* @param [type] $cate [description]

* @param integer $pid [description]

* @param integer $level [description]

* @param string $html [description]

* @return [type] [description]

*/

function sortOut($cate,$pid=0,$level=0,$html='--'){

$tree = array();

foreach($cate as $v){

if($v['pid'] == $pid){

$v['level'] = $level + 1;

$v['html'] = str_repeat($html, $level);

$tree[] = $v;

$tree = array_merge($tree, sortOut($cate,$v['id'],$level+1,$html));

}

}

return $tree;

}

JS递归(特殊):

40940077784d955d749f8fb077954f2b.png

这个函数相当于实现php的str_repeat函数

/* 字符串重复函数 */

if(!String.str_out_times) {

String.prototype.str_out_times = function(l) {

return new Array(l+1).join(this);

}

}

// 定位到当前选择

function recursion(selector, data, j, pid) {

var space = ' ┠ ';

if(!data) return false;

$.each(data, function(i, item) {

var opt = $(''+space.str_out_times(j)+item.name+'');selector.append(opt);

if(item.son && (item.son).length>0) {

recursion(selector, item.son, ++j);

j=0;

}

});

// 当前是哪个分类

selector.find('option').each(function() {

if($(this).val() == pid) {

$(this).attr('selected', 'selected');

}

});

}

为什么j=0呢。因为执行顺序感觉与php不同,这里是从上到下加载。。

ajax请求数据:

$('.btn-edit').click(function() {

var id = $(this).data('id');

$.post("{:U('Article/editArticle')}", {id: id}, function(res) {

// 分类

$('[name="pid"]').html('');

recursion($('[name="pid"]'), res.sort, 0, res.pid);

$('[name="id"]').val(res.id);

$('[name="title"]').val(res.title);

$('[name="summary"]').val(res.summary);

$('#thumbnailImg').attr('src', "__UPLOAD__"+'/thumbnail/'+res.thumbnail);

ue.setContent(res.content);

$('#modal-edit').modal('show');

});

});

以上就是thinkphp实现无限分类的方法,希望对大家的学习有所帮助。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值