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
模拟flock实现文件锁定
Feb 14 PHP
php标签云的实现代码
Oct 10 PHP
一些php项目中比较通用的php自建函数的详解
Jun 06 PHP
php加密解密函数authcode的用法详细解析
Oct 28 PHP
PHP学习笔记(二) 了解PHP的基本语法以及目录结构
Aug 04 PHP
WordPress中"无法将上传的文件移动至"错误的解决方法
Jul 01 PHP
php+ajax实现无刷新分页
Nov 18 PHP
WordPress中用于更新伪静态规则的PHP代码实例讲解
Dec 18 PHP
深入讲解PHP的对象注入(Object Injection)
Mar 01 PHP
php实现基于pdo的事务处理方法示例
Jul 21 PHP
laravel框架中路由设置,路由参数和路由命名实例分析
Nov 23 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/03/04 PHP
tp5框架使用composer实现日志记录功能示例
2019/01/10 PHP
JavaScript入门教程(6) Window窗口对象
2009/01/31 Javascript
js根据给定的日期计算当月有多少天实现思路及代码
2013/02/25 Javascript
点击隐藏页面左栏或右栏实现js代码
2013/04/01 Javascript
扩展js对象数组的OrderByAsc和OrderByDesc方法实现思路
2013/05/17 Javascript
html的DOM中document对象anchors集合用法实例
2015/01/21 Javascript
jQuery弹出框代码封装DialogHelper
2015/01/30 Javascript
JavaScript实现获取dom中class的方法
2015/02/09 Javascript
jQuery实现标题有打字效果的焦点图代码
2015/11/16 Javascript
jquery使用on绑定a标签无效 只能用live解决
2016/06/02 Javascript
Bootstrap Table使用整理(四)之工具栏
2017/06/09 Javascript
NodeJS自定义模块写法(详解)
2017/06/27 NodeJs
vue实现中部导航栏布局功能
2019/07/30 Javascript
JQuery省市联动效果实现过程详解
2020/05/08 jQuery
小程序富文本提取图片可放大缩小
2020/05/26 Javascript
python基础教程之获取本机ip数据包示例
2014/02/10 Python
教你如何在Django 1.6中正确使用 Signal
2014/06/22 Python
python中getaddrinfo()基本用法实例分析
2015/06/28 Python
python读写ini配置文件方法实例分析
2015/06/30 Python
Python 用Redis简单实现分布式爬虫的方法
2017/11/23 Python
教你如何编写、保存与运行Python程序的方法
2019/07/12 Python
Python实现微信翻译机器人的方法
2019/08/13 Python
python GUI库图形界面开发之PyQt5窗口类QMainWindow详细使用方法
2020/02/26 Python
浅谈selenium如何应对网页内容需要鼠标滚动加载的问题
2020/03/14 Python
Python图像识别+KNN求解数独的实现
2020/11/13 Python
探讨HTML5移动开发的几大特性(必看)
2015/12/30 HTML / CSS
高中毕业生生活的自我评价
2013/12/08 职场文书
《月迹》教学反思
2014/02/19 职场文书
学历公证委托书
2014/04/09 职场文书
党的群众路线教育实践活动制度建设计划方案
2014/10/31 职场文书
走群众路线学习笔记
2014/11/06 职场文书
大学生党性分析材料
2014/12/19 职场文书
分家协议书范本
2016/03/22 职场文书
南阳市白酒市场的调查报告
2019/11/08 职场文书
AJAX实现指定部分页面刷新效果
2021/10/16 Javascript