自制无限级分类算法。

Posted lewo的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自制无限级分类算法。相关的知识,希望对你有一定的参考价值。

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;
    }

 

以上是关于自制无限级分类算法。的主要内容,如果未能解决你的问题,请参考以下文章

PHP面试题精讲—无限级分类/无限分类的递归算法和非递归算法-带源码建议收藏

无限级分类实现思路

FreeSql 使用 ToTreeList/AsTreeCte 查询无限级分类表

无限级分类实现思路 (组织树的分级管理)

PHP迭代与递归实现无限级分类

php实现无限级分类(递归方法)