数据库表记录结构

 <?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. AttributeBehavior

    当事件触发的时候... 会循环所有behavior的events  为ower添加事件.....AttributeBehavior  为事件添加如下方法 public function evaluat ...

  2. SQL SERVER 查询Job作业基本信息及执行情况

    查询作业基本信息和作业执行情况 SELECT [jop].[job_id] AS '作业唯一标识符' ,[jop].[ name ] AS '作业名称' ,[dp].[ name ] AS '作业创建 ...

  3. C++_直接插入排序(纯C版)

    //用于比较大小 int compared(const void *key1,const void *key2) { cout<<"enter compare"< ...

  4. __asm__ __volatile__("": : :"memory");

    参考:http://stackoverflow.com/questions/14950614/working-of-asm-volatile-memory asmvolatile("&quo ...

  5. java面试笔试谈

    例一: public class Inc { public static void main(String[] args) { Inc inc=new Inc(); int i=5; inc.ferm ...

  6. MYSQL基础笔记(五)- 练习作业:站点统计练习

    作业:站点统计 1.将用户的访问信息记录到文件中,独占一行,记录IP地址 <?php //站点统计 header('Content-type:text/html;charset=utf-8'); ...

  7. python(3)-动态参数实现字符串格式化

    s1 = "{0} ===> {1}" s = s1.format('lilei', 'boy') print(s) l = ['lilei', 'boy'] s = s1. ...

  8. mysql root给其它用户授权问题

    今天登录mysql,给其它用户授权遇到问题 mysql> grant all privileges on testdb.* to 'dbuser'@'10.4.14.14' identified ...

  9. Ionic中弹窗

    Ionic中弹窗有两种ionicModal和ionicPopup; $ionicModal是完整的页面: $ionicPopup是(Dialog)对话框样式的,直接用JavaScript设定对话框的一 ...

  10. LeetCode 122

    Best Time to Buy and Sell Stock II Say you have an array for which the ith element is the price of a ...