数据库表记录结构

 <?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中无限处理分类的更多相关文章

  1. go中的无限极分类的问题

    最近在开发的过程中遇到一个无限极分类的问题,这种问题在php中写过很多,想着很简单,3-5分钟就能解决,结果竟然写了半小时,既然这样,就把这个给总结下. 思路 1.循环数据,放到hash中,把标识的数 ...

  2. PHP项目中经常用到的无限极分类函数

    //无限极分类函数调用 function getTree($data,$parent_id = 0,$dept_level = 0){ static $tree = []; foreach ($dat ...

  3. php无限极分类以及递归(thinkphp)

    php无限极分类: 无限极分类重点在于表的设计: 1在model中: class CatModel extends Model{ protected $cat = array(); public fu ...

  4. js实现无限极分类

    转载注明出处!!! 转载注明出处!!! 转载注明出处!!! 因为要实现部门通讯录,后台传来的数据是直接从数据库里拿的部门表,所以没有层级分类,只有parentId表示从属关系,所以分类的事情就交给我来 ...

  5. C#无限极分类树-创建-排序-读取 用Asp.Net Core+EF实现之方法二:加入缓存机制

    在上一篇文章中我用递归方法实现了管理菜单,在上一节我也提到要考虑用缓存,也算是学习一下.Net Core的缓存机制. 关于.Net Core的缓存,官方有三种实现: 1.In Memory Cachi ...

  6. C#无限极分类树-创建-排序-读取 用Asp.Net Core+EF实现

    今天做一个管理后台菜单,想着要用无限极分类,记得园子里还是什么地方见过这种写法,可今天找了半天也没找到,没办法静下心来自己写了: 首先创建节点类(我给它取名:AdminUserTree): /// & ...

  7. 谈一次php无限极分类的案例

    作者:白狼 出处:http://www.manks.top/php_tree_deep.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追 ...

  8. ecshop中$user对象

    ecshop中$user对象 2011-10-01 18:41:23|  分类: ECSHOP |  标签:ecshop  $user  对象  |举报|字号 订阅 http://blog.163.c ...

  9. 夺命雷公狗ThinkPHP项目之----企业网站8之栏目的添加完善(无限极分类的完成)

    我们刚才只是完成了添加的一部分,但是我们的上级分类也不能永远都是只有一个死的嘛,所以我们需要对她进行修改: 我们先将add方法里面的数据查出来再说: 然后在模板页进行遍历: 展示效果如下所示: 虽然是 ...

随机推荐

  1. Dijkstra最短路径算法[贪心]

    Dijkstra算法的标记和结构与prim算法的用法十分相似.它们两者都会从余下顶点的优先队列中选择下一个顶点来构造一颗扩展树.但千万不要把它们混淆了.它们解决的是不同的问题,因此,所操作的优先级也是 ...

  2. launch failed.Binary not found in Linux/Ubuntu解决方案

    Linux下出现launch failed.Binary not found的解决方案: 首先当你把网上关于mingw的解决方案都看晕了的时候,告诉你,别看关于mingw的了.Linux下不用ming ...

  3. 基于PHP的对接电子面单接口平台案例

    电子面单接口目前有三种对接方式,快递电子面单接口.菜鸟电子面单接口和快递鸟电子面单接口.这三种接口各有特点. 一.电子面单接口定义 1. 快递电子面单接口:快递公司自己开发的电子面单服务, 商家使用必 ...

  4. 结合源码看nginx-1.4.0之nginx事件驱动机制详解

    目录 0. 摘要 1. nginx事件模块组织结构 2. nginx事件模块数据结构及类图 3. nginx事件模块运行机制 4. 练习:一个简单的事件驱动模块 5. 小结 6. 参考源码

  5. HDU 3335 Divisibility (DLX)

    Divisibility Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit ...

  6. oracle 取随机数据

    --取随机数据 select dbms_random.value from dual; ); --百分比

  7. getBoundingClientRect()兼容性处理

    getBoundingClientRect() 这个方法返回一个矩形对象,包含四个属性:left.top.right和bottom.分别表示元素各边与页面上边和左边的距离. var box=docum ...

  8. HTML5와 CSS3 적용기

    HTML5의 DTD 선언 <!DOCTYPE html>  HTML5의 인코딩 선언 <meta charset="utf-8">  그리고나서는 새로 ...

  9. Bootstrap之导航栏(2015年-05年-20日)

    <nav class="navbar navbar-default" style="border-color: transparent;">< ...

  10. Android第三方授权(新浪微博篇)

    Android第三方认证新浪微博,相对微信,也比较简单,并且sina给了一个sdk和sdkdemo,这个demo封装了许多,但是自己不准备记录这个demo,而是直接使用sdk 同样去sina官方下载s ...