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 相关文章推荐
来自phpguru得Php Cache类源码
Apr 15 PHP
收集的二十一个实用便利的PHP函数代码
Apr 22 PHP
centos 5.6 升级php到5.3的方法
May 14 PHP
修改ThinkPHP缓存为Memcache的方法
Jun 25 PHP
ThinkPHP、ZF2、Yaf、Laravel框架路由大比拼
Mar 25 PHP
php实现从上传文件创建缩略图的方法
Apr 02 PHP
php常用图片处理类
Mar 16 PHP
PHP中子类重载父类的方法【parent::方法名】
May 06 PHP
php自定义函数转换html标签示例
Sep 29 PHP
php+ajax+json 详解及实例代码
Dec 12 PHP
PHP读取XML格式文件的方法总结
Feb 27 PHP
ThinkPHP框架实现FTP图片上传功能示例
Apr 08 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/10/09 PHP
由php if 想到的些问题
2008/03/22 PHP
深入分析php中接口与抽象类的区别
2013/06/08 PHP
ThinkPHP后台首页index使用frameset时的注意事项分析
2014/08/22 PHP
jquery获取多个checkbox的值异步提交给php的方法
2015/06/24 PHP
Extjs4 GridPanel 的几种样式使用介绍
2013/04/18 Javascript
javascript设置金额样式转换保留两位小数示例代码
2013/12/04 Javascript
jquery 按键盘上的enter事件
2014/05/11 Javascript
IE中JS跳转丢失referrer问题的2个解决方法
2014/07/18 Javascript
JQuery中Bind()事件用法分析
2015/05/05 Javascript
jQuery超赞的评分插件(8款)
2015/08/20 Javascript
浅析JS动态创建元素【两种方法】
2016/04/20 Javascript
JS实现重新加载当前页面
2016/11/29 Javascript
如何提高Dom访问速度
2017/01/05 Javascript
jQuery插件FusionCharts实现的3D帕累托图效果示例【附demo源码】
2017/03/25 jQuery
vue组件Prop传递数据的实现示例
2017/08/17 Javascript
vue中destroyed方法的使用说明
2020/07/21 Javascript
如何利用vue实现波谱拟合详解
2020/11/05 Javascript
[01:16:16]DOTA2-DPC中国联赛定级赛 RNG vs Phoenix BO3第二场 1月8日
2021/03/11 DOTA
Python的另外几种语言实现
2015/01/29 Python
Python语言的面相对象编程方式初步学习
2016/03/12 Python
Python读取word文本操作详解
2018/01/22 Python
Django Python 获取请求头信息Content-Range的方法
2019/08/06 Python
python super的使用方法及实例详解
2019/09/25 Python
使用python+whoosh实现全文检索
2019/12/09 Python
使用keras根据层名称来初始化网络
2020/05/21 Python
css3动画鼠标放上图片逐渐变大鼠标离开图片逐渐缩小效果
2021/01/27 HTML / CSS
中文系师范生自荐信
2013/10/01 职场文书
学生爱国演讲稿
2014/01/14 职场文书
司马光教学反思
2014/02/01 职场文书
2014年预备党员学习新党章思想汇报
2014/09/15 职场文书
街道务虚会发言材料
2014/10/20 职场文书
党员干部廉洁自律承诺书
2015/04/28 职场文书
2015暑期工社会实践报告
2015/07/13 职场文书
2015年秋学期师德师风建设工作总结
2015/10/23 职场文书
教你做个可爱的css滑动导航条
2021/06/15 HTML / CSS