thinkphp5使用无限极分类

本文实例为大家分享了thinkphp5使用无限极分类的具体代码,供大家参考,具体内容如下

1. 先根据普通递归完成无限极分类

2. 再根据分号的类的level 添加字符,再次存入数组的_name字段,最后按照_name字段输出

/**
  * 获得树状数据
  * @param $data 数据
  * @param $title    数据库中字段名
  * @param string $fieldPri  数据库中主键id
  * @param string $fieldPid  数据库中父id
  * @return array
  */
 static public function tree($data, $title, $fieldPri = 'cid', $fieldPid = 'pid')
 {
  if (!is_array($data) || empty($data))
   return array();
  $arr = Data::channelList($data);
  foreach ($arr as $k => $v) {
   $str = "";
   if ($v['_level'] > 2) {
    for ($i = 1; $i < $v['_level'] - 1; $i++) {
     $str .= "│ ";
    }
   }
   if ($v['_level'] != 1) {
    $t = $title ? $v[$title] : "";
    if (isset($arr[$k + 1]) && $arr[$k + 1]['_level'] >= $arr[$k]['_level']) {
     $arr[$k]['_name'] = $str . "├─ " . $v['_html'] . $t;
    } else {
     $arr[$k]['_name'] = $str . "└─ " . $v['_html'] . $t;
    }
   } else {
    $arr[$k]['_name'] = $v[$title];
   }
  }
  //设置主键为$fieldPri
  $data = array();
  foreach ($arr as $d) {
   $data[$d[$fieldPri]] = $d;
  }
  return $data;
 }
/**
  * 获得所有子栏目
  * @param $data 栏目数据
  * @param int $pid 操作的栏目
  * @param string $html 栏目名前字符
  * @param string $fieldPri 表主键
  * @param string $fieldPid 父id
  * @param int $level 等级
  * @return array
  */
 static public function channelList($data, $pid = 0, $html = " ", $fieldPri = 'cid', $fieldPid = 'pid', $level = 1)
 {
  $data = self::_channelList($data, $pid, $html, $fieldPri, $fieldPid, $level);
  if (empty($data))
   return $data;

  foreach ($data as $n => $m) {
   if ($m['_level'] == 1)
    continue;//结束单次循环
   $data[$n]['_first'] = false;
   $data[$n]['_end'] = false;
   if (!isset($data[$n - 1]) || $data[$n - 1]['_level'] != $m['_level']) {
    $data[$n]['_first'] = true;
   }
   if (isset($data[$n + 1]) && $data[$n]['_level'] > $data[$n + 1]['_level']) {
    $data[$n]['_end'] = true;
   }
  }
  //更新key为栏目主键
  $category=array();
  foreach($data as $d){
   $category[$d[$fieldPri]]=$d;
  }
  return $category;
 }
//只供channelList方法使用

 /**
  * 获得所有子栏目
  * @param $data 栏目数据
  * @param int $pid 操作的栏目
  * @param string $html 栏目名前字符
  * @param string $fieldPri 表主键
  * @param string $fieldPid 父id
  * @param int $level 等级
  * @return array
  */
 static private function _channelList($data, $pid = 0, $html = " ", $fieldPri = 'cid', $fieldPid = 'pid', $level = 1)
 {
  if (empty($data))
   return array();
  $arr = array();

  foreach ($data as $v) {
   $id = $v[$fieldPri];
   if ($v[$fieldPid] == $pid) {
    $v['_level'] = $level;
    $v['_html'] = str_repeat($html, $level - 1);
    $arr[] = $v;

    $tmp = self::_channelList($data, $id, $html, $fieldPri, $fieldPid, $level + 1);
    $arr = array_merge($arr, $tmp);//array_merge把两个数组整合为一个数组
   }
  }
  return $arr;
 }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • php无限极分类递归排序实现方法

    本文实例讲述了php无限极分类递归排序实现方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: function order ($array,$pid=0){     $arr = array();             foreach($array as $v){         if($v['pid']==$pid){             $arr[] = $v;             $arr = array_merge($arr,order($array,$v['

  • 深入浅析PHP无限极分类的案例教程

    平时开发中或多或少不可避免会遇到无限极分类的问题,因为效率.逻辑等问题也一直使这类问题比较尖锐.今天我们以yii2框架为基础,栏目无限极为例,对这个问题进行一个简单的处理. 首先我们有一张栏目数据表 tree 表结构如下图(原文有图) 看上去表结构很简单. 我们插入几条测试数据 INSERT INTO `tree` (`id`, `parent_id`, `name`) VALUES (1, 0, 'A'), (2, 0, 'B'), (3, 1, 'a'), (4, 3, 'aa'), (5,

  • 浅谈PHP无限极分类原理

    1.递归:程序调用自身的编程技巧称为递归 2.案例: /** * @param 递归 $[name] */ function deeploop(&$i=1){ echo $i; $i++; if($i < 10){ deeploop($i); } } deeploop(); 结果:123456789 3.global /** * @param 递归 $[name] */ $i = 1; function deeploop(){ global $i; //Global的作用是定义全局变量,但是

  • php无限极分类实现方法分析

    本文实例讲述了php无限极分类实现方法.分享给大家供大家参考,具体如下: 今天给大家带来的是php的无限极分类技术,本人把无限极分类划分为两种. 首先我把数据库表给大家看看,数据库是tasks,数据库表也是tasks 第一种方法(数组法) 这种方法其实是先把所有的数据查询出来,重点在于生成的二维数组 <?php //分类方法 function make_list($parent,$deep = 0){ global $tasks;//申明全局变量 global $strArr;//申明全局变量

  • php实现smarty模板无限极分类的方法

    本文实例讲述了php实现smarty模板无限极分类的方法.分享给大家供大家参考,具体如下: <?php $conn = mysql_connect("localhost","admin","admin"); mysql_select_db("people_shop",$conn); mysql_query("SET NAMES 'UTF-8'"); $class_arr=array(); $sql =

  • php无限极分类实现的两种解决方法

    今天写了下无限极分类 下面就把代码贴上来了 写的不怎么样. method of classify one 复制代码 代码如下: <?php/* reader: 这是自己写的无限极分类实现方法 里面的编辑方法只是对分类名进行了编辑 没有进行移动操作 小弟能力有限忘大家多多包涵啊 第一种方法:CREATE TABLE `types` (  `type_id` int(11) NOT NULL AUTO_INCREMENT,  `type_name` varchar(20) NOT NULL,  `t

  • PHP实现无限极分类生成分类树的方法

    本文实例讲述了PHP实现无限极分类生成分类树的方法.分享给大家供大家参考,具体如下: 现在的分类数据库设计基本都是:每一个分类有一个id主键字段,一个pid指向父类的id,这样便可实现无限级分类,取出的数据就是如下的格式: $arr = array( array("id" => 1 , "pid" => 0 , 'cat' => '栏目一'), array("id" => 2 , "pid" =>

  • php通过前序遍历树实现无需递归的无限极分类

    本文实例讲述了php通过前序遍历树实现无需递归的无限极分类.分享给大家供大家参考.具体如下: 大家通常都是使用递归实现无限极分类都知道递归效率很低,下面介绍一种改进的前序遍历树算法,不适用递归实现无限极分类,在大数据量实现树状层级结构的时候效率更高. sql代码如下: CREATE TABLE IF NOT EXISTS `category` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(50) NOT NULL, `lft` i

  • PHP超牛逼无限极分类生成树方法

    你还在用浪费时间又浪费内存的递归遍历无限极分类吗,看了该篇文章,我觉得你应该换换了. 这是我在OSChina上看到的一段非常精简的PHP无限极分类生成树方法,巧在引用,整理分享了. 复制代码 代码如下: function generateTree($items){     $tree = array();     foreach($items as $item){         if(isset($items[$item['pid']])){             $items[$item[

  • php 无限极分类

    复制代码 代码如下: <?php /*======================================================== 类名:catalog 功能:无限分级类 方法: 树形显示分类 catalog_show($id) //参数$id 递归调用 流程:找到父分类为0所有根分类-> 一直递归取得所有分类并显示   添加分类 catalog_add($uid,$name) //$uid 父id //$name 分类名   流程:依据$uid,在此id下添加一个新子id

  • PHP实现无限极分类的两种方式示例【递归和引用方式】

    本文实例讲述了PHP实现无限极分类的两种方式.分享给大家供大家参考,具体如下: 面试的时候被问到无限极分类的设计和实现,比较常见的做法是在建表的时候,增加一个PID字段用来区别自己所属的分类 $array = array( array('id' => 1, 'pid' => 0, 'name' => '河北省'), array('id' => 2, 'pid' => 0, 'name' => '北京市'), array('id' => 3, 'pid' =>

  • PHP无限极分类函数的实现方法详解

    本文实例讲述了PHP无限极分类函数的实现方法.分享给大家供大家参考,具体如下: 在开发程序的时候,有时候,我们需要获取所有栏目(包括一级栏目.二级栏目.三级栏目等等),并按照父子关系形成树型结构.可以采取使用递归或者通过引用方式(php中引用类似C或者C++中的指针,只不过换一种说法而已). 通过引用方式实现无限极分类 思路: 1.即所有待处理的数据进行包装成下标为主键id(pk)的数组,便于有pid获取对应的父栏目. 2.对包装的数据进行循环,如果为根节点,则将其引用添加到tree中,否则,将

随机推荐