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 相关文章推荐
做一个有下拉功能的留言版
Oct 09 PHP
phpfans留言版用到的install.php
Jan 04 PHP
php UTF-8、Unicode和BOM问题
May 18 PHP
关于PHP中Object对象的笔记分享
Jun 28 PHP
PHP实现ftp上传文件示例
Aug 21 PHP
php ajax异步读取rss文档数据
Mar 29 PHP
Yii2基于Ajax自动获取表单数据的方法
Aug 10 PHP
PHP基于DOM创建xml文档的方法示例
Feb 08 PHP
PHP将身份证正反面两张照片合成一张图片的代码
Apr 08 PHP
对php 判断http还是https,以及获得当前url的方法详解
Jan 15 PHP
CodeIgniter框架实现的整合Smarty引擎DEMO示例
Mar 28 PHP
php定期拉取数据对比方法实例
Sep 22 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中常用的转义函数
2014/02/28 PHP
PHP利用func_get_args和func_num_args函数实现函数重载实例
2014/11/12 PHP
thinkphp文件引用与分支结构用法实例
2014/11/26 PHP
wamp服务器访问php非常缓慢的解决过程
2015/07/01 PHP
php自定义分页类完整实例
2015/12/25 PHP
PHP对象、模式与实践之高级特性分析
2016/12/08 PHP
php readfile下载大文件失败的解决方法
2017/05/22 PHP
解决Laravel自定义类引入和命名空间的问题
2019/10/15 PHP
PHP pthreads v3下同步处理synchronized用法示例
2020/02/21 PHP
javascript中如何处理引号编码"
2013/08/15 Javascript
js创建对象的方式总结
2015/01/10 Javascript
全面了解函数声明与函数表达式、变量提升
2016/08/09 Javascript
js字符串操作总结(必看篇)
2016/11/22 Javascript
Angular4学习笔记之新建项目的方法
2017/07/18 Javascript
详解Webpack实战之构建 Electron 应用
2017/12/25 Javascript
解决vue-router进行build无法正常显示路由页面的问题
2018/03/06 Javascript
如何编写一个d.ts文件的步骤详解
2018/04/13 Javascript
layui 数据表格 点击分页按钮 监听事件的实例
2019/09/02 Javascript
node.js域名解析实现方法详解
2019/11/05 Javascript
javascript中的offsetWidth、clientWidth、innerWidth及相关属性方法
2020/05/14 Javascript
python操作日期和时间的方法
2014/03/11 Python
Win7上搭建Cocos2d-x 3.1.1开发环境
2014/07/03 Python
Python3.6基于正则实现的计算器示例【无优化简单注释版】
2018/06/14 Python
基于tensorflow加载部分层的方法
2018/07/26 Python
10 行 Python 代码教你自动发送短信(不想回复工作邮件妙招)
2018/10/11 Python
实例详解Python装饰器与闭包
2019/07/29 Python
html5 viewport使用方法示例详解
2013/12/02 HTML / CSS
美国知名生活购物网站:Goop
2017/11/03 全球购物
请写出 BOOL flag 与"零值"比较的 if 语句
2016/02/29 面试题
银行会计业务的个人自我评价
2013/11/02 职场文书
城市精细化管理实施方案
2014/03/04 职场文书
优质服务口号
2014/06/11 职场文书
2014镇党委班子对照检查材料思想汇报
2014/09/23 职场文书
德能勤绩廉个人总结
2015/02/14 职场文书
论文评审意见
2015/06/05 职场文书
python 下载文件的几种方式分享
2021/04/07 Python