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 中的输出缓冲
Dec 21 PHP
PHP5中虚函数的实现方法分享
Apr 20 PHP
php写的简易聊天室代码
Jun 04 PHP
php中的常用魔术方法总结
Aug 02 PHP
php操作xml入门之xml标签的属性分析
Jan 23 PHP
php批量删除cookie的简单实现方法
Jan 26 PHP
Apache服务器下防止图片盗链的办法
Jul 06 PHP
Zend Framework教程之分发器Zend_Controller_Dispatcher用法详解
Mar 07 PHP
PHP读MYSQL中文乱码的快速解决方法
Oct 01 PHP
PHP7内核之Reference详解
Mar 14 PHP
Yii框架的路由配置方法分析
Sep 09 PHP
PHP连接MSSQL数据库案例,PHPWAMP多个PHP版本连接SQL Server数据库
Apr 16 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页面间传递参数实例代码
2008/06/05 PHP
Linux下 php7安装redis的方法
2018/11/01 PHP
JavaScript 学习小结(适合新手参考)
2009/07/30 Javascript
JavaScript可否多线程? 深入理解JavaScript定时机制
2012/05/23 Javascript
jquery中get和post的简单实例
2014/02/04 Javascript
JavaScript对象反射用法实例
2015/04/17 Javascript
js控制多图左右滚动切换效果代码分享
2015/08/26 Javascript
JS模拟Dialog弹出浮动框效果代码
2015/10/16 Javascript
Bootstrap基本组件学习笔记之缩略图(13)
2016/12/08 Javascript
jQuery模拟窗口抖动效果
2017/03/15 Javascript
Vue组件tree实现树形菜单
2017/04/13 Javascript
Angular4如何自定义首屏的加载动画详解
2017/07/26 Javascript
使用Nodejs连接mongodb数据库的实现代码
2017/08/21 NodeJs
Node.JS中快速扫描端口并发现局域网内的Web服务器地址(80)
2017/09/18 Javascript
Javascript中的作用域及块级作用域
2017/12/08 Javascript
微信小程序实现两个页面传值的方法分析
2018/12/11 Javascript
Vue使用JSEncrypt实现rsa加密及挂载方法
2020/02/07 Javascript
详解vue 组件
2020/06/11 Javascript
如何在现代JavaScript中编写异步任务
2021/01/31 Javascript
python实现的生成随机迷宫算法核心代码分享(含游戏完整代码)
2014/07/11 Python
Python中的面向对象编程详解(下)
2015/04/13 Python
python实现数据库跨服务器迁移
2018/04/12 Python
pandas.DataFrame选取/排除特定行的方法
2018/07/03 Python
对python的bytes类型数据split分割切片方法
2018/12/04 Python
python 处理数字,把大于上限的数字置零实现方法
2019/01/28 Python
python使用selenium实现批量文件下载
2019/03/11 Python
Python pandas.DataFrame 找出有空值的行
2019/09/09 Python
python中的selenium安装的步骤(浏览器自动化测试框架)
2020/03/17 Python
英国领先的男装设计师服装购物网站:Mainline Menswear
2018/02/04 全球购物
英国男士时尚网站:Dandy Fellow
2018/02/09 全球购物
美国排名第一的泳池用品直接来源:In The Swim
2019/09/23 全球购物
毕业自我鉴定怎么写
2014/03/25 职场文书
公共场所标语
2014/06/30 职场文书
MySQL七大JOIN的具体使用
2022/02/28 MySQL
Android中View.post和Handler.post的关系
2022/06/05 Java/Android
springboot实现string转json json里面带数组
2022/06/16 Java/Android