ecshop中无限处理分类
数据库表记录结构

<?php
$sql = "SELECT c.cat_id, c.cat_name, c.measure_unit, c.parent_id, c.is_show,
c.show_in_nav, c.grade, c.sort_order, COUNT(s.cat_id) AS has_children
FROM ecs_category AS c
LEFT JOIN ecs_category AS s ON s.parent_id=c.cat_id
GROUP BY c.cat_id
ORDER BY c.parent_id, c.sort_order ASC";
//获取以上的数组
$res = '以上的数组';
/*
$res =
Array
(
[0] => Array
(
[cat_id] => 1
[cat_name] => 手机类型
[measure_unit] =>
[parent_id] => 0
[is_show] => 1
[show_in_nav] => 0
[grade] => 5
[sort_order] => 50
[has_children] => 4
) [1] => Array
(
[cat_id] => 18
[cat_name] => 圭亚那
[measure_unit] =>
[parent_id] => 0
[is_show] => 1
[show_in_nav] => 0
[grade] => 0
[sort_order] => 50
[has_children] => 0
) [2] => Array
(
[cat_id] => 12
[cat_name] => 充值卡
[measure_unit] =>
[parent_id] => 0
[is_show] => 1
[show_in_nav] => 0
[grade] => 0
[sort_order] => 50
[has_children] => 3
) [3] => Array
(
[cat_id] => 16
[cat_name] => 服装
[measure_unit] => 件
[parent_id] => 0
[is_show] => 1
[show_in_nav] => 0
[grade] => 8
[sort_order] => 50
[has_children] => 0
) [4] => Array
(
[cat_id] => 6
[cat_name] => 手机配件
[measure_unit] =>
[parent_id] => 0
[is_show] => 1
[show_in_nav] => 1
[grade] => 0
[sort_order] => 50
[has_children] => 4
) [5] => Array
(
[cat_id] => 17
[cat_name] => 食品
[measure_unit] => 斤
[parent_id] => 0
[is_show] => 1
[show_in_nav] => 0
[grade] => 5
[sort_order] => 50
[has_children] => 0
) [6] => Array
(
[cat_id] => 5
[cat_name] => 双模手机
[measure_unit] =>
[parent_id] => 1
[is_show] => 1
[show_in_nav] => 0
[grade] => 5
[sort_order] => 50
[has_children] => 0
) [7] => Array
(
[cat_id] => 2
[cat_name] => CDMA手机
[measure_unit] =>
[parent_id] => 1
[is_show] => 1
[show_in_nav] => 0
[grade] => 0
[sort_order] => 50
[has_children] => 0
) [8] => Array
(
[cat_id] => 3
[cat_name] => GSM手机
[measure_unit] => 台
[parent_id] => 1
[is_show] => 1
[show_in_nav] => 1
[grade] => 4
[sort_order] => 50
[has_children] => 1
) [9] => Array
(
[cat_id] => 4
[cat_name] => 3G手机
[measure_unit] =>
[parent_id] => 1
[is_show] => 1
[show_in_nav] => 1
[grade] => 0
[sort_order] => 50
[has_children] => 0
) [10] => Array
(
[cat_id] => 19
[cat_name] => 模型机
[measure_unit] =>
[parent_id] => 3
[is_show] => 1
[show_in_nav] => 0
[grade] => 3
[sort_order] => 50
[has_children] => 2
) [11] => Array
(
[cat_id] => 8
[cat_name] => 耳机
[measure_unit] =>
[parent_id] => 6
[is_show] => 1
[show_in_nav] => 0
[grade] => 0
[sort_order] => 50
[has_children] => 0
) [12] => Array
(
[cat_id] => 9
[cat_name] => 电池
[measure_unit] =>
[parent_id] => 6
[is_show] => 1
[show_in_nav] => 0
[grade] => 0
[sort_order] => 50
[has_children] => 0
) [13] => Array
(
[cat_id] => 11
[cat_name] => 读卡器和内存卡
[measure_unit] =>
[parent_id] => 6
[is_show] => 1
[show_in_nav] => 0
[grade] => 0
[sort_order] => 50
[has_children] => 0
) [14] => Array
(
[cat_id] => 7
[cat_name] => 充电器
[measure_unit] =>
[parent_id] => 6
[is_show] => 1
[show_in_nav] => 0
[grade] => 0
[sort_order] => 50
[has_children] => 0
) [15] => Array
(
[cat_id] => 15
[cat_name] => 联通手机充值卡
[measure_unit] =>
[parent_id] => 12
[is_show] => 1
[show_in_nav] => 0
[grade] => 0
[sort_order] => 50
[has_children] => 0
) [16] => Array
(
[cat_id] => 13
[cat_name] => 小灵通/固话充值卡
[measure_unit] =>
[parent_id] => 12
[is_show] => 1
[show_in_nav] => 0
[grade] => 0
[sort_order] => 50
[has_children] => 0
) [17] => Array
(
[cat_id] => 14
[cat_name] => 移动手机充值卡
[measure_unit] =>
[parent_id] => 12
[is_show] => 1
[show_in_nav] => 0
[grade] => 0
[sort_order] => 50
[has_children] => 0
) [18] => Array
(
[cat_id] => 20
[cat_name] => 金属机
[measure_unit] => 台
[parent_id] => 19
[is_show] => 1
[show_in_nav] => 0
[grade] => 0
[sort_order] => 50
[has_children] => 1
) [19] => Array
(
[cat_id] => 21
[cat_name] => 塑料机
[measure_unit] => 台
[parent_id] => 19
[is_show] => 1
[show_in_nav] => 0
[grade] => 0
[sort_order] => 50
[has_children] => 1
) [20] => Array
(
[cat_id] => 23
[cat_name] => 诺基亚6300
[measure_unit] =>
[parent_id] => 20
[is_show] => 1
[show_in_nav] => 0
[grade] => 1
[sort_order] => 50
[has_children] => 0
) [21] => Array
(
[cat_id] => 22
[cat_name] => 三星
[measure_unit] =>
[parent_id] => 21
[is_show] => 1
[show_in_nav] => 0
[grade] => 0
[sort_order] => 50
[has_children] => 0
) )
*/ /*
优化成等级的分层数组,以 level 决定是第几层缩进,
$cat_id为指定的分类,$res为上面的数组分组
*/
$options = cat_options($cat_id, $res);
function cat_options($spec_cat_id, $arr){
static $cat_options = array();
if (!isset($cat_options[0]))
{
$level = $last_cat_id = 0;
$options = $cat_id_array = $level_array = array();
if ($data === false)
{
while (!empty($arr))
{
foreach ($arr AS $key => $value)
{
$cat_id = $value['cat_id'];
if ($level == 0 && $last_cat_id == 0)
{
if ($value['parent_id'] > 0)
{ // 非父类
break;
}
$options[$cat_id] = $value;
$options[$cat_id]['level'] = $level;
$options[$cat_id]['id'] = $cat_id;
$options[$cat_id]['name'] = $value['cat_name'];
unset($arr[$key]);
if ($value['has_children'] == 0)
{
continue;
}
$last_cat_id = $cat_id;
$cat_id_array = array($cat_id);
$level_array[$last_cat_id] = ++$level;
continue;
} // end if ($level == 0 && $last_cat_id == 0)
if ($value['parent_id'] == $last_cat_id)
{
$options[$cat_id] = $value;
$options[$cat_id]['level'] = $level;
$options[$cat_id]['id'] = $cat_id;
$options[$cat_id]['name'] = $value['cat_name'];
unset($arr[$key]);
if ($value['has_children'] > 0)
{
/*
判断是否是有跨级的,如
$array = array(1=>'',
2=>'',
3=>'',
4=>''
5=>'')
$array[3],$array[5]之间,由于在array[4]时,此时为末节点
此时会由
$last_cat_id = array_pop($cat_id_array);
所以会导致 array[3]独立出来,这样就必须加上
*/
if (end($cat_id_array) != $last_cat_id)
{
$cat_id_array[] = $last_cat_id;
}
$last_cat_id = $cat_id;
$cat_id_array[] = $cat_id;
$level_array[$last_cat_id] = ++$level;
}
} // eof if ($value['parent_id'] == $last_cat_id)
elseif ($value['parent_id'] > $last_cat_id)
{
break;
} // eof if ($value['parent_id'] == $last_cat_id)
}
// end foreach ------------
$count = count($cat_id_array);
if ($count > 1)
{
$last_cat_id = array_pop($cat_id_array);
}
elseif ($count == 1)
{ //由于上一级的原因,会导致 $last_cat_id是子节点
if ($last_cat_id != end($cat_id_array))
{
$last_cat_id = end($cat_id_array);
}
else
{
$level = 0;
$last_cat_id = 0;
$cat_id_array = array();
continue;
}
}
if ($last_cat_id && isset($level_array[$last_cat_id]))
{
$level = $level_array[$last_cat_id];
}
else
{
$level = 0;
}
}
// end while ------------
//如果数组过大,不采用静态缓存方式
if (count($options) <= 2000)
{
write_static_cache('cat_option_static', $options);
}
}
else
{
$options = $data;
}
$cat_options[0] = $options;
}
else
{
$options = $cat_options[0];
}
if (!$spec_cat_id)
{
return $options;
}
else
{
if (empty($options[$spec_cat_id]))
{
return array();
}
$spec_cat_id_level = $options[$spec_cat_id]['level'];
foreach ($options AS $key => $value)
{
if ($key != $spec_cat_id)
{
unset($options[$key]);
}
else
{
break;
}
}
$spec_cat_id_array = array();
foreach ($options AS $key => $value)
{
if (($spec_cat_id_level == $value['level'] && $value['cat_id'] != $spec_cat_id) ||
($spec_cat_id_level > $value['level']))
{
break;
}
else
{
$spec_cat_id_array[$key] = $value;
}
}
$cat_options[$spec_cat_id] = $spec_cat_id_array;
return $spec_cat_id_array;
}
} /*
$options 结果为
Array
(
[1] => Array
(
[cat_id] => 1
[cat_name] => 手机类型
[measure_unit] =>
[parent_id] => 0
[is_show] => 1
[show_in_nav] => 0
[grade] => 5
[sort_order] => 50
[has_children] => 4
[goods_num] => 0
[level] => 0
[id] => 1
[name] => 手机类型
[url] => category.php?id=1
) [5] => Array
(
[cat_id] => 5
[cat_name] => 双模手机
[measure_unit] =>
[parent_id] => 1
[is_show] => 1
[show_in_nav] => 0
[grade] => 5
[sort_order] => 50
[has_children] => 0
[goods_num] => 2
[level] => 1
[id] => 5
[name] => 双模手机
[url] => category.php?id=5
) [2] => Array
(
[cat_id] => 2
[cat_name] => CDMA手机
[measure_unit] =>
[parent_id] => 1
[is_show] => 1
[show_in_nav] => 0
[grade] => 0
[sort_order] => 50
[has_children] => 0
[goods_num] => 0
[level] => 1
[id] => 2
[name] => CDMA手机
[url] => category.php?id=2
) [3] => Array
(
[cat_id] => 3
[cat_name] => GSM手机
[measure_unit] => 台
[parent_id] => 1
[is_show] => 1
[show_in_nav] => 1
[grade] => 4
[sort_order] => 50
[has_children] => 1
[goods_num] => 13
[level] => 1
[id] => 3
[name] => GSM手机
[url] => category.php?id=3
) [19] => Array
(
[cat_id] => 19
[cat_name] => 模型机
[measure_unit] =>
[parent_id] => 3
[is_show] => 1
[show_in_nav] => 0
[grade] => 3
[sort_order] => 50
[has_children] => 2
[goods_num] => 0
[level] => 2
[id] => 19
[name] => 模型机
[url] => category.php?id=19
) [20] => Array
(
[cat_id] => 20
[cat_name] => 金属机
[measure_unit] => 台
[parent_id] => 19
[is_show] => 1
[show_in_nav] => 0
[grade] => 0
[sort_order] => 50
[has_children] => 1
[goods_num] => 0
[level] => 3
[id] => 20
[name] => 金属机
[url] => category.php?id=20
) [23] => Array
(
[cat_id] => 23
[cat_name] => 诺基亚6300
[measure_unit] =>
[parent_id] => 20
[is_show] => 1
[show_in_nav] => 0
[grade] => 1
[sort_order] => 50
[has_children] => 0
[goods_num] => 2
[level] => 4
[id] => 23
[name] => 诺基亚6300
[url] => category.php?id=23
) [21] => Array
(
[cat_id] => 21
[cat_name] => 塑料机
[measure_unit] => 台
[parent_id] => 19
[is_show] => 1
[show_in_nav] => 0
[grade] => 0
[sort_order] => 50
[has_children] => 1
[goods_num] => 0
[level] => 3
[id] => 21
[name] => 塑料机
[url] => category.php?id=21
) [22] => Array
(
[cat_id] => 22
[cat_name] => 三星
[measure_unit] =>
[parent_id] => 21
[is_show] => 1
[show_in_nav] => 0
[grade] => 0
[sort_order] => 50
[has_children] => 0
[goods_num] => 0
[level] => 4
[id] => 22
[name] => 三星
[url] => category.php?id=22
) [4] => Array
(
[cat_id] => 4
[cat_name] => 3G手机
[measure_unit] =>
[parent_id] => 1
[is_show] => 1
[show_in_nav] => 1
[grade] => 0
[sort_order] => 50
[has_children] => 0
[goods_num] => 3
[level] => 1
[id] => 4
[name] => 3G手机
[url] => category.php?id=4
) [18] => Array
(
[cat_id] => 18
[cat_name] => 圭亚那
[measure_unit] =>
[parent_id] => 0
[is_show] => 1
[show_in_nav] => 0
[grade] => 0
[sort_order] => 50
[has_children] => 0
[goods_num] => 1
[level] => 0
[id] => 18
[name] => 圭亚那
[url] => category.php?id=18
) [12] => Array
(
[cat_id] => 12
[cat_name] => 充值卡
[measure_unit] =>
[parent_id] => 0
[is_show] => 1
[show_in_nav] => 0
[grade] => 0
[sort_order] => 50
[has_children] => 3
[goods_num] => 0
[level] => 0
[id] => 12
[name] => 充值卡
[url] => category.php?id=12
) [15] => Array
(
[cat_id] => 15
[cat_name] => 联通手机充值卡
[measure_unit] =>
[parent_id] => 12
[is_show] => 1
[show_in_nav] => 0
[grade] => 0
[sort_order] => 50
[has_children] => 0
[goods_num] => 2
[level] => 1
[id] => 15
[name] => 联通手机充值卡
[url] => category.php?id=15
) [13] => Array
(
[cat_id] => 13
[cat_name] => 小灵通/固话充值卡
[measure_unit] =>
[parent_id] => 12
[is_show] => 1
[show_in_nav] => 0
[grade] => 0
[sort_order] => 50
[has_children] => 0
[goods_num] => 2
[level] => 1
[id] => 13
[name] => 小灵通/固话充值卡
[url] => category.php?id=13
) [14] => Array
(
[cat_id] => 14
[cat_name] => 移动手机充值卡
[measure_unit] =>
[parent_id] => 12
[is_show] => 1
[show_in_nav] => 0
[grade] => 0
[sort_order] => 50
[has_children] => 0
[goods_num] => 2
[level] => 1
[id] => 14
[name] => 移动手机充值卡
[url] => category.php?id=14
) [16] => Array
(
[cat_id] => 16
[cat_name] => 服装
[measure_unit] => 件
[parent_id] => 0
[is_show] => 1
[show_in_nav] => 0
[grade] => 8
[sort_order] => 50
[has_children] => 0
[goods_num] => 1
[level] => 0
[id] => 16
[name] => 服装
[url] => category.php?id=16
) [6] => Array
(
[cat_id] => 6
[cat_name] => 手机配件
[measure_unit] =>
[parent_id] => 0
[is_show] => 1
[show_in_nav] => 1
[grade] => 0
[sort_order] => 50
[has_children] => 4
[goods_num] => 0
[level] => 0
[id] => 6
[name] => 手机配件
[url] => category.php?id=6
) [8] => Array
(
[cat_id] => 8
[cat_name] => 耳机
[measure_unit] =>
[parent_id] => 6
[is_show] => 1
[show_in_nav] => 0
[grade] => 0
[sort_order] => 50
[has_children] => 0
[goods_num] => 3
[level] => 1
[id] => 8
[name] => 耳机
[url] => category.php?id=8
) [9] => Array
(
[cat_id] => 9
[cat_name] => 电池
[measure_unit] =>
[parent_id] => 6
[is_show] => 1
[show_in_nav] => 0
[grade] => 0
[sort_order] => 50
[has_children] => 0
[goods_num] => 0
[level] => 1
[id] => 9
[name] => 电池
[url] => category.php?id=9
) [11] => Array
(
[cat_id] => 11
[cat_name] => 读卡器和内存卡
[measure_unit] =>
[parent_id] => 6
[is_show] => 1
[show_in_nav] => 0
[grade] => 0
[sort_order] => 50
[has_children] => 0
[goods_num] => 2
[level] => 1
[id] => 11
[name] => 读卡器和内存卡
[url] => category.php?id=11
) [7] => Array
(
[cat_id] => 7
[cat_name] => 充电器
[measure_unit] =>
[parent_id] => 6
[is_show] => 1
[show_in_nav] => 0
[grade] => 0
[sort_order] => 50
[has_children] => 0
[goods_num] => 0
[level] => 1
[id] => 7
[name] => 充电器
[url] => category.php?id=7
) [17] => Array
(
[cat_id] => 17
[cat_name] => 食品
[measure_unit] => 斤
[parent_id] => 0
[is_show] => 1
[show_in_nav] => 0
[grade] => 5
[sort_order] => 50
[has_children] => 0
[goods_num] => 0
[level] => 0
[id] => 17
[name] => 食品
[url] => category.php?id=17
) ) */
// 结果如下图

ecshop中无限处理分类的更多相关文章
- go中的无限极分类的问题
最近在开发的过程中遇到一个无限极分类的问题,这种问题在php中写过很多,想着很简单,3-5分钟就能解决,结果竟然写了半小时,既然这样,就把这个给总结下. 思路 1.循环数据,放到hash中,把标识的数 ...
- PHP项目中经常用到的无限极分类函数
//无限极分类函数调用 function getTree($data,$parent_id = 0,$dept_level = 0){ static $tree = []; foreach ($dat ...
- php无限极分类以及递归(thinkphp)
php无限极分类: 无限极分类重点在于表的设计: 1在model中: class CatModel extends Model{ protected $cat = array(); public fu ...
- js实现无限极分类
转载注明出处!!! 转载注明出处!!! 转载注明出处!!! 因为要实现部门通讯录,后台传来的数据是直接从数据库里拿的部门表,所以没有层级分类,只有parentId表示从属关系,所以分类的事情就交给我来 ...
- C#无限极分类树-创建-排序-读取 用Asp.Net Core+EF实现之方法二:加入缓存机制
在上一篇文章中我用递归方法实现了管理菜单,在上一节我也提到要考虑用缓存,也算是学习一下.Net Core的缓存机制. 关于.Net Core的缓存,官方有三种实现: 1.In Memory Cachi ...
- C#无限极分类树-创建-排序-读取 用Asp.Net Core+EF实现
今天做一个管理后台菜单,想着要用无限极分类,记得园子里还是什么地方见过这种写法,可今天找了半天也没找到,没办法静下心来自己写了: 首先创建节点类(我给它取名:AdminUserTree): /// & ...
- 谈一次php无限极分类的案例
作者:白狼 出处:http://www.manks.top/php_tree_deep.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追 ...
- ecshop中$user对象
ecshop中$user对象 2011-10-01 18:41:23| 分类: ECSHOP | 标签:ecshop $user 对象 |举报|字号 订阅 http://blog.163.c ...
- 夺命雷公狗ThinkPHP项目之----企业网站8之栏目的添加完善(无限极分类的完成)
我们刚才只是完成了添加的一部分,但是我们的上级分类也不能永远都是只有一个死的嘛,所以我们需要对她进行修改: 我们先将add方法里面的数据查出来再说: 然后在模板页进行遍历: 展示效果如下所示: 虽然是 ...
随机推荐
- solaris知识库
http://xjsunjie.blog.51cto.com/999372/d-9/p-1
- 用CAS操作实现Go标准库中的Once
Go标准库中提供了Sync.Once来实现"只执行一次"的功能.学习了一下源代码,里面用的是经典的双重检查的模式: // Once is an object that will p ...
- Spring 的微内核与FactoryBean扩展机制--转载
作者:江南白衣 原文地址: http://www.blogjava.net/calvin/archive/2005/08/30/11099.html http://www.blogjava.net/c ...
- [Java,MVC] SpringMVC+Spring+hibernate 框架
转自:http://my.oschina.net/Thinkeryjgfn/blog/158951 1.准备的jar包以及配置文件如下: 2.新建一个JAVA web项目 3.建好以后出现以上包结构即 ...
- iOS类别(category)不能添加成员变量但是可以添加属性的问题
类别不需要介绍了把,网上一大堆(利用Objective-C的动态运行时分配机制,可以为现有的类添加新方法,这种为现有的类添加新方法的方式称为类别catagory,他可以为任何类添加新的方法,包括那些没 ...
- ios webview点击图片看大图效果及相应手势操作
下面参考资料有比较详细的解释,在之前的就项目中也有比较好的效果(支持更多手势),可以参考下 参考资料
- sql 自定义函数--十进制转二进制
随笔记忆: if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[DECTOBIN]') and xtype in ...
- 探讨PHP页面跳转几种实现技巧
PHP被许多程序员用来开发WEB的首选语言.在实际开发中,网站的各项功能都可以通过PHP语言的编写来满足,比如PHP页面跳转这一方法. 探讨PHP变量解析顺序如何获取提交数据 深入解读PHP运行机制 ...
- Linux安装Oracle 11G过程(测试未写完)
一.简介 Oracle数据库在系统运维中的重要性不言而喻,通过熟悉Oracle的安装来加深对操作系统和数据库知识的了解.Linux安装Oracle前期修改linux内核参数很重要,其实就是linux下 ...
- GDB基本调试
调试时gcc -g -Wall -o Hello Hello.c gdb Hello -tui -g: 生成调试信息 -Wall: 编译器警告信息 -W: 警告信息 在调用GDB时,命令行指定-tui ...