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 相关文章推荐
如何使用PHP获取网络上文件
Oct 09 PHP
繁体中文转换为简体中文的PHP函数
Oct 09 PHP
dedecms中常见问题修改方法总结
Mar 21 PHP
php读取excel文件的简单实例
Aug 26 PHP
php接口和抽象类使用示例详解
Mar 02 PHP
简单实用的PHP防注入类实例
Dec 05 PHP
php数组添加元素方法小结
Dec 20 PHP
PHP实现抓取迅雷VIP账号的方法
Jul 30 PHP
图文详解phpstorm配置Xdebug进行调试PHP教程
Jun 13 PHP
PHP二分查找算法示例【递归与非递归方法】
Sep 29 PHP
详谈php ip2long 出现负数的原因及解决方法
Apr 05 PHP
解决laravel上传图片之后,目录有图片,但是访问不到(404)的问题
Oct 14 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函数(ignore_user_abort)
2012/08/01 PHP
解析PHP计算页面执行时间的实现代码
2013/06/18 PHP
分享下页面关键字抓取www.icbase.com站点代码(带asp.net参数的)
2014/01/30 PHP
PHP写日志的实现方法
2014/11/05 PHP
laravel中短信发送验证码的实现方法
2018/04/25 PHP
PHP基于curl模拟post提交json数据示例
2018/06/22 PHP
jquery ajax post提交数据乱码
2013/11/05 Javascript
如何在JavaScript中实现私有属性的写类方式(一)
2013/12/04 Javascript
jQuery实现拖拽页面元素并将其保存到cookie的方法
2016/06/12 Javascript
浅谈jQuery before和insertBefore的区别
2016/12/04 Javascript
javascript数组去重方法分析
2016/12/15 Javascript
Angular下H5上传图片的方法(可多张上传)
2017/01/09 Javascript
常用的几个JQuery代码片段
2017/03/13 Javascript
对Angular中单向数据流的深入理解
2018/03/31 Javascript
微信小程序中使用Async-await方法异步请求变为同步请求方法
2019/03/28 Javascript
Vue中UI组件库之Vuex与虚拟服务器初识
2019/05/07 Javascript
JS实现小星星特效
2019/12/24 Javascript
vue+element 实现商城主题开发的示例代码
2020/03/26 Javascript
[57:37]EG vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
利用numpy和pandas处理csv文件中的时间方法
2018/04/19 Python
下载python中Crypto库报错:ModuleNotFoundError: No module named ‘Crypto’的解决
2018/04/23 Python
Python代码缩进和测试模块示例详解
2018/05/07 Python
Python下简易的单例模式详解
2019/04/08 Python
django的分页器Paginator 从django中导入类
2019/07/25 Python
pytorch SENet实现案例
2020/06/24 Python
基于 HTML5 WebGL 实现的垃圾分类系统
2019/10/08 HTML / CSS
瑜伽灵感珠宝:Satya Jewelry
2018/01/06 全球购物
俄罗斯Sportmarket体育在线商店:用于旅游和户外活动
2019/11/12 全球购物
大学生活自我评价
2014/04/09 职场文书
淘宝客服专员岗位职责
2014/04/11 职场文书
导师就业推荐信范文
2014/05/22 职场文书
党的群众路线教育实践活动学习计划
2014/11/03 职场文书
党员活动总结
2015/02/04 职场文书
如何写好一份优秀的工作总结?
2019/06/21 职场文书
python基于OpenCV模板匹配识别图片中的数字
2021/03/31 Python
MySQL 中如何归档数据的实现方法
2022/03/16 SQL Server