PHP数组无限分级数据的层级化处理代码


Posted in PHP onDecember 29, 2012
/**
 * 创建父节点树形数组
 * 参数
 * $ar 数组,邻接列表方式组织的数据
 * $id 数组中作为主键的下标或关联键名
 * $pid 数组中作为父键的下标或关联键名
 * 返回 多维数组
 **/
function find_parent($ar, $id='id', $pid='pid') { 
  foreach($ar as $v) $t[$v[$id]] = $v;
  foreach ($t as $k => $item){
    if( $item[$pid] ){
      if( ! isset($t[$item[$pid]]['parent'][$item[$pid]]) )
         $t[$item[$id]]['parent'][$item[$pid]] =& $t[$item[$pid]];
          $t[$k]['reference'] = true;
    }
  } 
  return $t;
}
/**
 * 创建子节点树形数组
 * 参数
 * $ar 数组,邻接列表方式组织的数据
 * $id 数组中作为主键的下标或关联键名
 * $pid 数组中作为父键的下标或关联键名
 * 返回 多维数组
 **/
function find_child($ar, $id='id', $pid='pid') {
  foreach($ar as $v) $t[$v[$id]] = $v;
  foreach ($t as $k => $item){
    if( $item[$pid] ) {
      $t[$item[$pid]]['child'][$item[$id]] =& $t[$k];
      $t[$k]['reference'] = true;
    }
  }
  return $t;
}

示例:
$data = array( 
    array('ID'=>1, 'PARENT'=>0, 'NAME'=>'祖父'), 
    array('ID'=>2, 'PARENT'=>1, 'NAME'=>'父亲'), 
    array('ID'=>3, 'PARENT'=>1, 'NAME'=>'叔伯'), 
    array('ID'=>4, 'PARENT'=>2, 'NAME'=>'自己'), 
    array('ID'=>5, 'PARENT'=>4, 'NAME'=>'儿子')
); 
$p = find_parent($data, 'ID', 'PARENT'); 
$c = find_child($data, 'ID', 'PARENT');

上面两种方法是将所有节点按id平摊到一个数组中,然后找到他们的 parent 或 children ,通过引用将 平摊的元素挂接到 parent 、children 下,
但被引用的元素依然存在于平摊的数组中,因此,在实际应用时,最好标记那些被引用的元素,以避免以他们为根开始遍历,导致重复。
        foreach ($p as $key => $item) {
            if($item['reference']) continue;
            print_r($item);
        }
        foreach ($c as $key => $item) {
            if($item['reference']) continue;
            print_r($item);
        }

递归法,PHP 数组元素被删除后,数组游标会归零,因此在遍历过程中一些已经找到 “归宿” 的元素也不得不留在数组中,无法缩减后继元素的搜索范围:
$mylist = array(array( 'parent_id'=>0,'id'=>1),
                    array( 'parent_id'=>0,'id'=>2),
                    array( 'parent_id'=>0,'id'=>3),    
                    array( 'parent_id'=>2,'id'=>4),
                    array( 'parent_id'=>2,'id'=>5),
                    array( 'parent_id'=>3,'id'=>6),
                    array( 'parent_id'=>3,'id'=>7),    
                    array( 'parent_id'=>4,'id'=>8),
                    array( 'parent_id'=>5,'id'=>9),
                    array( 'parent_id'=>5,'id'=>10)
                );
    function _findChildren($list, $p_id){    //数据层级化,
          $r = array();
          foreach($list as $id=>$item){
            if($item['parent_id'] == $p_id) {
                   $length = count($r);
                  $r[$length] = $item;
                  if($t = $this->_findChildren($list, $item['id']) ){
                      $r[$length]['children'] = $t;
                  }                
            }
          }
          return $r;
    }  
print_r(_findChildren($mylist, 0));
PHP 相关文章推荐
推荐Discuz!5的PHP代码高亮显示与实现可运行代码
Mar 15 PHP
PHP实现MVC开发得最简单的方法――模型
Apr 10 PHP
解析如何用php screw加密php源代码
Jun 20 PHP
提升PHP性能的21种方法介绍
Jun 25 PHP
PHP日期函数date格式化UNIX时间的方法
Mar 19 PHP
php字符串函数学习之substr()
Mar 27 PHP
PHP实现的购物车类实例
Jun 17 PHP
php array_pop 删除数组最后一个元素实例
Nov 02 PHP
php使用PDO获取结果集的方法
Feb 16 PHP
EarthLiveSharp中cloudinary的CDN图片缓存自动清理python脚本
Apr 04 PHP
php 人员权限管理(RBAC)实例(推荐)
May 24 PHP
使用tp框架和SQL语句查询数据表中的某字段包含某值
Oct 18 PHP
php学习笔记之面向对象编程
Dec 29 #PHP
php5.3中连接sqlserver2000的两种方法(com与ODBC)
Dec 29 #PHP
PHP中计算字符串相似度的函数代码
Dec 29 #PHP
PHP flock 文件锁详细介绍
Dec 29 #PHP
PHP生成唯一的促销/优惠/折扣码(附源码)
Dec 28 #PHP
PHP中函数rand和mt_rand的区别比较
Dec 26 #PHP
php中unlink()、mkdir()、rmdir()等方法的使用介绍
Dec 21 #PHP
You might like
PHP 字符串操作入门教程
2006/12/06 PHP
PHP如何利用P3P实现跨域
2013/08/24 PHP
php使用fopen创建utf8编码文件的方法
2014/10/31 PHP
php下foreach提示Warning:Invalid argument supplied for foreach()的解决方法
2014/11/11 PHP
PHP中读取文件的几个方法总结(推荐)
2016/06/03 PHP
Code:findPosX 和 findPosY
2006/12/20 Javascript
基于jquery的一个OutlookBar类,动态创建导航条
2010/11/19 Javascript
Jquery实现点击切换图片并隐藏显示内容(2种方法实现)
2013/04/11 Javascript
js单向链表的具体实现实例
2013/06/21 Javascript
JS实现滑动菜单效果代码(包括Tab,选项卡,横向等效果)
2015/09/24 Javascript
jQuery实现为控件添加水印文字效果(附源码)
2015/12/02 Javascript
JS使用eval()动态创建变量的方法
2016/06/03 Javascript
微信小程序 less文件编译成wxss文件实现办法
2016/12/05 Javascript
Vue中img的src属性绑定与static文件夹实例
2017/05/18 Javascript
jQuery实现获取table中鼠标click点击位置行号与列号的方法
2017/10/09 jQuery
jQuery实现table表格checkbox全选的方法分析
2018/07/04 jQuery
Vue实现左右菜单联动实现代码
2018/08/12 Javascript
详解React native fetch遇到的坑
2018/08/30 Javascript
JS canvas绘制五子棋的棋盘
2020/05/28 Javascript
javascript中的数据类型检测方法详解
2019/08/07 Javascript
Python下的Mysql模块MySQLdb安装详解
2014/04/09 Python
详解Python3 中hasattr()、getattr()、setattr()、delattr()函数及示例代码数
2018/04/18 Python
python实现大学人员管理系统
2019/10/25 Python
Python sorted对list和dict排序
2020/06/09 Python
Python logging模块异步线程写日志实现过程解析
2020/06/30 Python
css3制作动态进度条以及附加jQuery百分比数字显示
2012/12/13 HTML / CSS
39美元购买一副眼镜或太阳镜:39DollarGlasses.com
2018/06/17 全球购物
乐高瑞士官方商店:LEGO CH
2020/08/16 全球购物
节约能源标语
2014/06/17 职场文书
优秀党务工作者先进事迹材料
2014/12/25 职场文书
初中信息技术教学计划
2015/01/22 职场文书
导师工作推荐信
2015/03/27 职场文书
英雄儿女观后感
2015/06/09 职场文书
2015年教导处教学工作总结
2015/07/22 职场文书
消防宣传标语大全
2015/08/03 职场文书
创业计划之特色精品店
2019/08/12 职场文书