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方法里面的数据查出来再说: 然后在模板页进行遍历: 展示效果如下所示: 虽然是 ...
随机推荐
- 阿里技术嘉年华(ADC2013)总结与感悟
上周末刚参加了ADC2013(2013.7.13-14),我报的是TCon测试论坛和UCAN用户体验设计论坛,因为我目前从事的是测试工作,但是还是想往用户体验(主要是用研)方向发展,所以 ...
- java_闭包和回调实现一边按键盘一边演讲
package ming; interface Teachable { void work(); } class Programer { private String name; public Str ...
- 我的第一款Cocos2d 游戏小狗快跑基本完成
- 深入分析 Linux 内核链表
转载:http://www.ibm.com/developerworks/cn/linux/kernel/l-chain/ 一. 链表数据结构简介 链表是一种常用的组织有序数据的数据结构,它通过指 ...
- Linux shell 脚本攻略之比较与测试
摘自:<Linux shell 脚本攻略>Page30-33
- [翻译]Json.NET API-Linq to Json Basic Operator(基本操作)【转】
在Json.NET开源的组件的API文档中看到其中有个Linq To Json基本操作.详细看了其中API 中Linq to SQL命名空间下定义类方法.以及实现, 觉得参与Linq 来操作Json从 ...
- 使用 Feedly RSS阅读器订阅技术大牛的博客
这几天一直都在自己看书,可是书上面的东西都比较落后一点,而且没有大牛博文上的东西讲的深入,可是来回跳转各位大牛的博客又非常的麻烦,有一些公众账号虽然也会推荐一些知识内容,可是你应该有过看到多个公众号发 ...
- 查看Oracle执行计划的几种方法
查看Oracle执行计划的几种方法 一.通过PL/SQL Dev工具 1.直接File->New->Explain Plan Window,在窗口中执行sql可以查看计划结果.其中,Cos ...
- linux云计算集群架构学习笔记:系统文件的目录结构
文件的基本管理和XFS文件系统备份恢复 1.1 Linux系统目录结构,相对/绝对路径. 1.2 创建/复制/删除文件,rm -rf / 意外事故 1.3 查看文件内容 1.4 xfs文件系统的备 ...
- <转>cookie和缓存解析
原文来自:http://www.cnblogs.com/cuihongyu3503319/archive/2008/04/18/1160083.html 缓存cache 为了提高访问网页的速度,浏览器 ...