zoukankan      html  css  js  c++  java
  • php+mysql 实现无限极分类


    php+mysql 实现无限极分类
    <pre>
    id name pid path

    1 电脑 0 0

    2 手机 0 0

    3 笔记本 1 0-1

    4 超级本 3 0-1-3

    5 游戏本 3 0-1-3
    </pre>


    这种方式,假设我们要查询电脑下的所有后代分类,只需要一条sql语句:

    <pre>
    select id,name from category where path like ( select concat(path,'-',id,'%') path from category where id=1 );
    </pre>


    优点:查询容易,效率高,path字段可以加索引。

    缺点:更新节点关系麻烦,需要更新所有后辈的path字段。

    方案一的样例代码:

    <pre>
    <?php

    $addrs = array(

    array('id'=>1, 'name'=>'中国', 'pid'=>0),

    array('id'=>2, 'name'=>'河南', 'pid'=>1),

    array('id'=>3, 'name'=>'郑州', 'pid'=>2),

    array('id'=>4, 'name'=>'洛阳', 'pid'=>2),

    array('id'=>5, 'name'=>'安阳', 'pid'=>2),

    array('id'=>6, 'name'=>'林州', 'pid'=>5),

    array('id'=>7, 'name'=>'安阳县', 'pid'=>5),

    array('id'=>8, 'name'=>'内黄', 'pid'=>5),

    array('id'=>9, 'name'=>'滑县', 'pid'=>5),

    array('id'=>10, 'name'=>'城郊乡', 'pid'=>6),

    array('id'=>11, 'name'=>'湖南', 'pid'=>1),

    array('id'=>12, 'name'=>'长沙', 'pid'=>11),

    array('id'=>13, 'name'=>'湘潭', 'pid'=>11),

    array('id'=>14, 'name'=>'岳麓区', 'pid'=>12),

    );

    // 查询子树(采用递归方法)

    function get_childs($id)

    {

    global $addrs;

    $ret = array();

    foreach($addrs as &$addr) // 此处使用 & 运算符,提高效率

    {

    if($addr['pid'] == $id)

    {

    $addr['children'] = get_childs($addr['id']);

    $ret[] = $addr;

    }

    }

    return $ret;

    }

    // test code

    echo '<pre>';

    print_r( get_childs(1) );

    echo '<hr/>';

    print_r($addrs);
    </pre>

  • 相关阅读:
    Yii2框架bootstrap样式理解
    spring 配置bean的方法及依赖注入发方式
    C#深拷贝
    【麦子学院】Linux cmd命令大全
    JEECG中的validform验证ajaxurl的使用方法
    ORACLE 如何查询被锁定表及如何解锁释放session
    获取请求真实ip
    jsp值传到后台Struts2中的action三种方法
    ajax 二级联动与springmvc 交互
    SpringMVC返回json数据的三种方式
  • 原文地址:https://www.cnblogs.com/newmiracle/p/11856260.html
Copyright © 2011-2022 走看看