• 自制无限级分类算法。


    JavaScript版:

    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
        <meta charset="utf-8">
        <title></title>
    </head>
    <body>
        
        <script type="text/javascript">
            var arr = {
                '1'  : 0,
                '2'  : 1,
                '3'  : 0,
                '4'  : 1,
                '5'  : 2,
                '6'  : 0,
                '7'  : 6,
                '8'  : 5,
                '9'  : 8,
                '10'  : 8
            };
            var id,i=0;
            /**
             * tree = [{ id:,pid:,level: }]
             */
            var tree = [];
            for(var key in arr){
                if(arr[key]==0){ // 属于顶级
                    tree.push({id:key,pid:arr[key],level:0});
                }else{
                    id = key;
                    i = 0;
                    while(arr[id]){
                        id = arr[id];
                        i++;
                    }
                    tree.push({id:key,pid:arr[key],level:i});
                }
            }
            console.log(tree);
        </script>
    
    </body>
    </html>

    PHP版

    <?php
    /**
     * [infiniteOrder 无限级分类]
     * @author 江波
     * @date 2016-12-28
     * @param  [string] $list            [分类列表]
     * @param  [string] $field_pid       [用于分类的字段名称]
     * @param  [string] $pval            [顶层结束值]
     * @return [array]                   [分类之后的列表]
     * @throws 
     */
    function infiniteOrder(&$list, $field_pid = 'pid', $pval = 0){
      // 用于缓存结果
      $arr = array();
      foreach($list as $key => $val){
          $i = 0;
          if($val[ $field_pid ] != $pval){ // 不属于顶级
              $id = $val[ $field_pid ];
              // 当循环至顶级结束
              while($val[ $id ] != $pval){
                  $id = $val[ $id ];
                  $i++;
              }
          }
          $val['_level'] = $i;
          $arr[] = $val;
      }
      return $arr;
    }
    public function getInfiniteList(){
            $arr = array();
            // 分类列表
            $list = $this->select();
            foreach($list as $k1 => $v1){
                $arr[ $v1['id'] ] = $v1['pid'];
            }
    
            $i = 0;
            foreach($arr as $k2 => $v2){
                $level = 0;
                $pid = $v2['pid'];
                if($pid != 0){ // 不属于顶级
                    $level++;
                    // 当循环至顶级结束
                    while($arr[$pid] != 0){
                        $pid = $arr[$pid];
                        $level++;
                    }
                }
                $list[$i]['_level'] = $level;
                $i++;
            }
            return $list;
        }
  • 相关阅读:
    NOIP2018游记
    NOIP2018T1DAY1——Road(并查集做法??)
    UVA11021 Tribles——概率dp
    捡石头——(期望递推)
    USACO2008mar-gold牛跑步(第k短路:A-star)
    Java中的异常处理
    Java学习手册
    各种应用层注入手段整理 【转载】
    正则表达式学习
    Run-Time Check Failure #0,The value of ESP was not properly saved 错误解决
  • 原文地址:https://www.cnblogs.com/jiangxiaobo/p/6229841.html
Copyright © 2020-2023  润新知