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与已存在的Java应用程序集成
Oct 09 PHP
用php和MySql来与ODBC数据连接
Oct 09 PHP
dedecms模版制作使用方法
Apr 03 PHP
PHP函数常用用法小结
Feb 08 PHP
Joomla下利用configuration.php存储简单数据
May 19 PHP
PHP句法规则详解 入门学习
Nov 09 PHP
PHP中根据IP地址判断城市实现城市切换或跳转代码
Sep 04 PHP
php隐藏IP地址后两位显示为星号的方法
Nov 21 PHP
MAC下通过改apache配置文件切换php多版本的方法
Apr 26 PHP
PHP判断一个数组是另一个数组子集的方法详解
Jul 31 PHP
总结PHP代码规范、流程规范、git规范
Jun 18 PHP
PHP+redis实现的限制抢购防止商品超发功能详解
Sep 19 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设计模式之命令模式的深入解析
2013/06/13 PHP
php警告Creating default object from empty value 问题的解决方法
2014/04/02 PHP
php中的mongodb select常用操作代码示例
2014/09/06 PHP
php 函数中静态变量使用的问题实例分析
2020/03/05 PHP
js模拟C#中List的简单实例
2014/03/06 Javascript
Javascript 函数parseInt()转换时出现bug问题
2014/05/20 Javascript
js代码实现的加入收藏效果并兼容主流浏览器
2014/06/23 Javascript
教你用AngularJS框架一行JS代码实现控件验证效果
2014/06/23 Javascript
基于jquery的文字向上跑动类似跑马灯的效果
2014/09/22 Javascript
jquery操作select方法汇总
2015/02/05 Javascript
js实现从中间开始往上下展开网页窗口的方法
2015/03/02 Javascript
妙用Bootstrap的 popover插件实现校验表单提示功能
2016/08/29 Javascript
js实现手机发送验证码功能
2017/03/13 Javascript
微信小程序的部署方法步骤
2018/09/04 Javascript
ajax跨域访问遇到的问题及解决方案
2019/05/23 Javascript
JavaScript生成一个不重复的ID的方法示例
2019/09/16 Javascript
微信小程序去除左上角返回键的实现方法
2020/03/06 Javascript
react的hooks的用法详解
2020/10/12 Javascript
Python 详解基本语法_函数_返回值
2017/01/22 Python
python如何将图片转换为字符图片
2020/08/19 Python
对Python中的条件判断、循环以及循环的终止方法详解
2019/02/08 Python
python中logging模块的一些简单用法的使用
2019/02/22 Python
Python使用sqlalchemy模块连接数据库操作示例
2019/03/13 Python
利用python和百度地图API实现数据地图标注的方法
2019/05/13 Python
python判断一个对象是否可迭代的例子
2019/07/22 Python
关于Flask项目无法使用公网IP访问的解决方式
2019/11/19 Python
Python 根据数据模板创建shapefile的实现
2019/11/26 Python
浅谈django 重载str 方法
2020/05/19 Python
Jacques Lemans德国:奥地利钟表品牌
2019/12/26 全球购物
西雅图电动自行车公司:Rad Power Bikes
2020/02/02 全球购物
大学生的网上创业计划书
2013/12/31 职场文书
终止劳动合同证明书样本
2014/11/19 职场文书
优秀高中学生评语
2014/12/30 职场文书
办公室卫生管理制度
2015/08/04 职场文书
2019财务转正述职报告
2019/06/27 职场文书
详解MySQL的内连接和外连接
2023/05/08 MySQL