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 相关文章推荐
xajax写的留言本
Nov 25 PHP
允许phpmyadmin空密码登录的配置方法
May 29 PHP
php中的Base62类(适用于数值转字符串)
Aug 12 PHP
PHP判断文章里是否有图片的简单方法
Jul 26 PHP
PHP中几个可以提高运行效率的代码写法、技巧分享
Aug 21 PHP
php使用GD库创建图片缩略图的方法
Jun 10 PHP
php 无限级分类 获取顶级分类ID
Mar 13 PHP
PHP常用函数总结(180多个)
Dec 25 PHP
PHP水印类,支持添加图片、文字、填充颜色区域的实现
Feb 04 PHP
PHP魔术方法之__call与__callStatic使用方法
Jul 23 PHP
php大小写转换函数(strtolower、strtoupper)用法介绍
Nov 17 PHP
PHP实现将上传图片自动缩放到指定分辨率,并保持清晰度封装类示例
Jun 17 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源代码
2009/08/21 PHP
php is_file()和is_dir()用于遍历目录时用法注意事项
2010/03/02 PHP
fgetcvs在linux的问题
2012/01/15 PHP
ThinkPHP模版引擎之变量输出详解
2014/12/05 PHP
php使用explode()函数将字符串拆分成数组的方法
2015/02/17 PHP
php函数实现判断是否移动端访问
2015/03/03 PHP
php使用COPY函数更新配置文件的方法
2015/06/18 PHP
thinkPHP中create方法与令牌验证实例浅析
2015/12/08 PHP
Laravel下生成验证码的类
2017/11/15 PHP
PHP PDOStatement::getAttribute讲解
2019/02/01 PHP
利用javascript实现一些常用软件的下载导航
2009/08/03 Javascript
jQuery阻止同类型事件小结
2013/04/19 Javascript
仿百度的关键词匹配搜索示例
2013/09/25 Javascript
javascript 兼容各个浏览器的事件
2015/02/04 Javascript
nodejs调用cmd命令实现复制目录
2015/05/04 NodeJs
介绍JavaScript中Math.abs()方法的使用
2015/06/14 Javascript
基于javascript代码检测访问网页的浏览器呈现引擎、平台、Windows操作系统、移动设备和游戏系统
2015/12/03 Javascript
javascript中错误使用var造成undefined
2016/03/31 Javascript
浅析js绑定事件的常用方法
2016/05/15 Javascript
详解使用create-react-app添加css modules、sasss和antd
2018/07/31 Javascript
[06:25]DOTA2英雄梦之声_第17期_大地之灵
2014/06/20 DOTA
[42:36]DOTA2上海特级锦标赛B组败者赛 VG VS Spirit第二局
2016/02/26 DOTA
Django框架中处理URLconf中特定的URL的方法
2015/07/20 Python
python变量命名的7条建议
2019/07/04 Python
Python包,__init__.py功能与用法分析
2020/01/07 Python
Python callable内置函数原理解析
2020/03/05 Python
Python图片处理模块PIL操作方法(pillow)
2020/04/07 Python
sklearn线性逻辑回归和非线性逻辑回归的实现
2020/06/09 Python
世界上最大的罕见唱片、CD和音乐纪念品网上商店:991.com
2018/05/03 全球购物
什么是Remote Module
2016/06/10 面试题
中学生运动会入场词
2014/02/12 职场文书
财务部副经理岗位职责
2014/03/14 职场文书
《花瓣飘香》教学反思
2014/04/15 职场文书
11.9消防日宣传标语
2014/10/08 职场文书
优秀共青团员事迹材料
2014/12/25 职场文书
2015年暑期社会实践报告
2015/07/13 职场文书