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 相关文章推荐
PHP4 与 MySQL 数据库操作函数详解
Oct 09 PHP
第三节--定义一个类
Nov 16 PHP
PHP 如何获取二维数组中某个key的集合
Jun 03 PHP
浅谈PHP正则表达式中修饰符/i, /is, /s, /isU
Oct 21 PHP
PHP利用hash冲突漏洞进行DDoS攻击的方法分析
Mar 26 PHP
php实现改变图片直接打开为下载的方法
Apr 14 PHP
php自定义hash函数实例
May 05 PHP
又十个超级有用的PHP代码片段
Sep 24 PHP
降低PHP Redis内存占用
Mar 23 PHP
php实现往pdf中加数字签名操作示例【附源码下载】
Aug 07 PHP
thinkphp框架使用JWTtoken的方法详解
Oct 10 PHP
Laravel 自动转换长整型雪花 ID 为字符串的实现
Oct 27 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
Linux下 php5 MySQL5 Apache2 phpMyAdmin ZendOptimizer安装与配置[图文]
2008/11/18 PHP
PHP的变量类型和作用域详解
2014/03/12 PHP
微信支付开发发货通知实例
2016/07/12 PHP
PHP开发之归档格式phar文件概念与用法详解【创建,使用,解包还原提取】
2017/11/17 PHP
JavaScript 原型与继承说明
2010/06/09 Javascript
jquery入门—选择器实现隔行变色实例代码
2013/01/04 Javascript
ExpressJS入门实例
2015/01/14 Javascript
js 定位到某个锚点的方法
2016/11/19 Javascript
ExtJs的Ext.Ajax.request实现waitMsg等待提示效果
2017/06/14 Javascript
js实现本地图片文件拖拽效果
2017/07/18 Javascript
3种vue组件的书写形式
2017/11/29 Javascript
js代码规范之Eslint安装与配置详解
2018/09/08 Javascript
用JS实现一个简单的打砖块游戏
2019/12/11 Javascript
vue 公共列表选择组件,引用Vant-UI的样式方式
2020/11/02 Javascript
python读取html中指定元素生成excle文件示例
2014/04/03 Python
python模拟enum枚举类型的方法小结
2015/04/30 Python
Django框架中数据的连锁查询和限制返回数据的方法
2015/07/17 Python
详解Python中映射类型(字典)操作符的概念和使用
2015/08/19 Python
python获取当前文件路径以及父文件路径的方法
2019/07/10 Python
python 利用jinja2模板生成html代码实例
2019/10/10 Python
Python基于DB-API操作MySQL数据库过程解析
2020/04/23 Python
如何理解python面向对象编程
2020/06/01 Python
获取CSDN文章内容并转换为markdown文本的python
2020/09/06 Python
python3爬虫GIL修改多线程实例讲解
2020/11/24 Python
scrapy-splash简单使用详解
2021/02/21 Python
Allen Edmonds官方网站:一家美国优质男士鞋类及配饰制造商
2019/03/12 全球购物
工厂仓管员岗位职责
2014/01/01 职场文书
直接有效的自我评价
2014/01/11 职场文书
财务会计毕业生个人求职信
2014/02/03 职场文书
文秘大学生求职信
2014/02/25 职场文书
国旗下演讲稿
2014/05/08 职场文书
体育运动口号
2014/06/09 职场文书
有限公司股东合作协议书
2014/10/29 职场文书
难以忽视的真相观后感
2015/06/05 职场文书
Web前端:CSS最强总结 附详细代码
2021/03/31 HTML / CSS
Html5生成验证码的示例代码
2021/05/10 Javascript