zoukankan      html  css  js  c++  java
  • 无限极分类中递归查找一个树结构

    问题:设计公司的员工表,员工有不同级别,要求可通过一个员工查到其下属的所有员工,也可查到其所属的上级。

    解决:递归实现无限分类思想,每一个员工存入其所属的上级的id作为自己的pid,另外存入path,path包含自身id,方便显示路径。

    递归的注意点:

    1.一定有一个判断条件,否则递归就死循环了

    2.每次的递归结果要保存起来,变量自增的实现三种方式:

    function(&$bar):通过引用地址

    global :通过设置为全局变量

    static :设置为静态变量

    复制代码
    header( "Content-type: text/html; charset=utf-8" );
    
    $arr = array(
        array( 'uid'=>'1', 'name'=>'总监张', 'pid'=>'0', 'path'=>'0,' ),
        array( 'uid'=>'2', 'name'=>'副总王', 'pid'=>'1', 'path'=>'0,1,' ),
        array( 'uid'=>'3', 'name'=>'经理赵', 'pid'=>'2', 'path'=>'0,1,2,' ),
        array( 'uid'=>'4', 'name'=>'员工赵', 'pid'=>'6', 'path'=>'0,1,2,3,6,' ),
        array( 'uid'=>'5', 'name'=>'员工房', 'pid'=>'6', 'path'=>'0,1,2,3,6,' ),
        array( 'uid'=>'6', 'name'=>'组长刘', 'pid'=>'3', 'path'=>'0,1,2,3,' ),
        array( 'uid'=>'7', 'name'=>'经理光杆', 'pid'=>'2', 'path'=>'0,1,2,' ),
    );
    
    /**
     * 通过传入要查找的人的pid来递归查找他的下属,代码简陋,理解精神为主
     * @param  array  $data    数组代替数据库中的数据
     * @param  integer $pid     父id
     * @param  array   &$result 结果数组,&保证变量常驻
     * @param  integer $deep    输出的分隔符--,无实际意义
     * @return 树状结构数组
     */
    function getList( $data, $pid=0, &$result=array(), $deep = 0 ) {
        $deep+=2;
        foreach ( $data as $key => $val ) {
            if ( $pid == $val['pid'] ) {
                $result[] = "|".str_repeat("--", $deep).$val['name'];
                getList( $data, $val['uid'],  $result, $deep );
            }
        }
    
        return $result;
    }
    
    //调用函数输出结果
    $res = getList($arr, 1); //查找副总王的下属
    foreach($res as $key=>$val){
        echo $val."
    ";
    }
    /*
    |----副总王
    |--------经理赵
    |------------组长刘
    |----------------员工赵
    |----------------员工房
    |--------经理光杆
    */
    复制代码

    还是上边的数据,现在要查一个员工的所有上级

    复制代码
    /**
     * 传入员工的id,可以查找员工所属的上级
     * @param  array  $data     数组代替数据库中的数据
     * @param  integer $id      要查找的员工的id
     * @param  array   &$result 结果数组,&保证变量常驻
     * @return 结果
     */
    function getLink($data, $id=0, &$result=array()){
    
        foreach ($data as $key => $val) {
            if ($val['uid'] == $id) {
                $result[] = $val['name'];
                getLink($data, $val['pid'], $result);
            }
        }
    
        return $result;
    }
    
    $res = getLink($arr , 5); //查找员工房的上级
    foreach ($res as $key => $val) {
        echo $val." | ";
    }
    /* 员工房 | 组长刘 | 经理赵 | 副总王 | 总监张 |  */

    注:也可用全路径无限分类:数据中存了path,全路径可通过concat(path,",",id)算出来。
    优点:查询快,比递归快
    缺点:增加,移动分类时稍显复杂

  • 相关阅读:
    Quartz.Net 作业调度后台管理系统,基于Extjs
    [备份]EntityFramework
    WebMisSharp升级说明,最新版本1.6.0
    AllPay(欧付宝)支付接口集成
    Paypal Rest Api自定义物流地址(跳过填写物流地址)
    根据IP获取国家
    ViewBag 找不到编译动态表达式所需的一种或多种类型,是否缺少引用?
    Extjs4 DateTimeField,日期时间控件完美版
    IOS Swift 训练
    .Net集成PayPal的Demo
  • 原文地址:https://www.cnblogs.com/KTblog/p/9025120.html
Copyright © 2011-2022 走看看