侯体宗的博客
  • 首页
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

php 无限分类 树形数据格式化代码

php  /  管理员 发布于 7年前   148

我们知道很多开源软件的无限分类都是采用递归的算法,但是我们知道递归即浪费时间,又浪费空间(内存),
上次我也分享了个我自己原创的无限分类生成树的方法,一热心php高手网友给我提出了宝贵的建议,我测试了一下,这段代码的时间非常之短参考: http://www.oschina.net/code/snippet_98719_11296,我再次整理了一下,发现数据库查询出数据之后,我们就已经定好了键值,因而实践中,我们一般会在model中查询出格式化成主键值对应数据的形式,因而我们可以直接用这样的数据,就少了一层循环。代码也非常简洁。

原来的代码:

function genTree($items,$id='id',$pid='pid',$son = 'children'){  $tree = array(); //格式化的树  $tmpMap = array(); //临时扁平数据     foreach ($items as $item) {    $tmpMap[$item[$id]] = $item;  }     foreach ($items as $item) {    if (isset($tmpMap[$item[$pid]])) {      $tmpMap[$item[$pid]][$son][] = &$tmpMap[$item[$id]];    } else {      $tree[] = &$tmpMap[$item[$id]];    }  }  unset($tmpMap);  return $tree;} $items1 = array(    array('id' => 1, 'pid' => 0, 'name' => '一级11' ),    array('id' => 11, 'pid' => 0, 'name' => '一级12' ),    array('id' => 2, 'pid' => 1, 'name' => '二级21' ),    array('id' => 10, 'pid' => 11, 'name' => '二级22' ),    array('id' => 3, 'pid' => 1, 'name' => '二级23' ),    array('id' => 12, 'pid' => 11, 'name' => '二级24' ),    array('id' => 9, 'pid' => 1, 'name' => '二级25' ),    array('id' => 14, 'pid' => 1, 'name' => '二级26' ),    array('id' => 4, 'pid' => 9, 'name' => '三级31' ),    array('id' => 6, 'pid' => 9, 'name' => '三级32' ),    array('id' => 7, 'pid' => 4, 'name' => '四级41' ),    array('id' => 8, 'pid' => 4, 'name' => '四级42' ),    array('id' => 5, 'pid' => 4, 'name' => '四级43' ),    array('id' => 13, 'pid' => 4, 'name' => '四级44' ),    array('id' => 15, 'pid' => 8, 'name' => '五级51' ),    array('id' => 16, 'pid' => 8, 'name' => '五级52' ),    array('id' => 17, 'pid' => 8, 'name' => '五级53' ),    array('id' => 18, 'pid' => 16, 'name' => '六级64' ),); var_dump(genTree($items1));

以下是补充:

/** * 此方法由@Tonton 提供 * http://my.oschina.net/u/918697 * @date 2012-12-12 */function genTree5($items) {  foreach ($items as $item)    $items[$item['pid']]['son'][$item['id']] = &$items[$item['id']];  return isset($items[0]['son']) ? $items[0]['son'] : array();}
/** * 将数据格式化成树形结构 * @author Xuefen.Tong * @param array $items * @return array */function genTree9($items) {  $tree = array(); //格式化好的树  foreach ($items as $item)    if (isset($items[$item['pid']]))      $items[$item['pid']]['son'][] = &$items[$item['id']];    else      $tree[] = &$items[$item['id']];  return $tree;} $items = array(  1 => array('id' => 1, 'pid' => 0, 'name' => '江西省'),  2 => array('id' => 2, 'pid' => 0, 'name' => '黑龙江省'),  3 => array('id' => 3, 'pid' => 1, 'name' => '南昌市'),  4 => array('id' => 4, 'pid' => 2, 'name' => '哈尔滨市'),  5 => array('id' => 5, 'pid' => 2, 'name' => '鸡西市'),  6 => array('id' => 6, 'pid' => 4, 'name' => '香坊区'),  7 => array('id' => 7, 'pid' => 4, 'name' => '南岗区'),  8 => array('id' => 8, 'pid' => 6, 'name' => '和兴路'),  9 => array('id' => 9, 'pid' => 7, 'name' => '西大直街'),  10 => array('id' => 10, 'pid' => 8, 'name' => '东北林业大学'),  11 => array('id' => 11, 'pid' => 9, 'name' => '哈尔滨工业大学'),  12 => array('id' => 12, 'pid' => 8, 'name' => '哈尔滨师范大学'),  13 => array('id' => 13, 'pid' => 1, 'name' => '赣州市'),  14 => array('id' => 14, 'pid' => 13, 'name' => '赣县'),  15 => array('id' => 15, 'pid' => 13, 'name' => '于都县'),  16 => array('id' => 16, 'pid' => 14, 'name' => '茅店镇'),  17 => array('id' => 17, 'pid' => 14, 'name' => '大田乡'),  18 => array('id' => 18, 'pid' => 16, 'name' => '义源村'),  19 => array('id' => 19, 'pid' => 16, 'name' => '上坝村'),);print_r(genTree5($items));print_r(genTree9($items));//后者输出格式,前者类似,只是数组键值不一样,不过不影响数据结构/*Array([0] => Array  (    [id] => 1    [pid] => 0    [name] => 江西省    [son] => Array      (        [0] => Array          ([id] => 3[pid] => 1[name] => 南昌市          )         [1] => Array          ([id] => 13[pid] => 1[name] => 赣州市[son] => Array  (    [0] => Array      (        [id] => 14        [pid] => 13        [name] => 赣县        [son] => Array          (          [0] => Array(  [id] => 16  [pid] => 14  [name] => 茅店镇  [son] => Array    (    [0] => Array      (      [id] => 18      [pid] => 16      [name] => 义源村      )     [1] => Array      (      [id] => 19      [pid] => 16      [name] => 上坝村      )     ) )           [1] => Array(  [id] => 17  [pid] => 14  [name] => 大田乡)           )       )     [1] => Array      (        [id] => 15        [pid] => 13        [name] => 于都县      )   )           )       )   ) [1] => Array  (    [id] => 2    [pid] => 0    [name] => 黑龙江省    [son] => Array      (        [0] => Array          ([id] => 4[pid] => 2[name] => 哈尔滨市[son] => Array  (  [0] => Array    (      [id] => 6      [pid] => 4      [name] => 香坊区      [son] => Array        (        [0] => Array          ([id] => 8[pid] => 6[name] => 和兴路[son] => Array  (    [0] => Array      (      [id] => 10      [pid] => 8      [name] =>       东北林业大学      )     [1] => Array      (      [id] => 12      [pid] => 8      [name] =>      哈尔滨师范大学      )   )           )         )     )   [1] => Array    (      [id] => 7      [pid] => 4      [name] => 南岗区      [son] => Array        (        [0] => Array          (          [id] => 9          [pid] => 7          [name] => 西大直街          [son] => Array([0] => Array  (  [id] => 11  [pid] => 9  [name] =>   哈尔滨工业大学  ) )           )         )     )   )           )         [1] => Array          ([id] => 5[pid] => 2[name] => 鸡西市          )       )   ))*/

极其简单有效!!!非常受用!

您可能感兴趣的文章:

  • php实现的树形结构数据存取类实例
  • thinkPHP实现递归循环栏目并按照树形结构无限极输出的方法
  • PHP无限分类(树形类)
  • 基于递归实现的php树形菜单代码
  • php从数据库查询结果生成树形列表的方法
  • PHP无限分类(树形类)的深入分析
  • php简单实现无限分类树形列表的方法
  • php显示当前文件所在的文件以及文件夹所有文件以树形展开
  • PHP树形结构tree类用法示例


  • 上一条:
    PHP从二维数组得到N层分类树的实现代码
    下一条:
    PHP简单判断iPhone、iPad、Android及PC设备的方法
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • 用Time Warden监控PHP中的代码处理时间(0个评论)
    • 在PHP中使用array_pop + yield实现读取超大型目录功能示例(0个评论)
    • Property Hooks RFC在PHP 8.4中越来越接近现实(0个评论)
    • 近期文章
    • 在windows10中升级go版本至1.24后LiteIDE的Ctrl+左击无法跳转问题解决方案(0个评论)
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(95个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-06
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-11
    • 2017-12
    • 2018-01
    • 2018-02
    • 2018-03
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-09
    • 2021-02
    • 2021-03
    • 2021-04
    • 2021-05
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-09
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-02
    • 2024-03
    • 2024-04
    • 2024-05
    • 2024-06
    • 2024-07
    • 2024-09
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客