1,

    /**
* 将一个平面的二维数组按照指定的字段转换为树状结构
*
* 用法:
* @code php
* $rows = array(
* array('id' => 1, 'value' => '1-1', 'parent' => 0),
* array('id' => 2, 'value' => '2-1', 'parent' => 0),
* array('id' => 3, 'value' => '3-1', 'parent' => 0),
*
* array('id' => 7, 'value' => '2-1-1', 'parent' => 2),
* array('id' => 8, 'value' => '2-1-2', 'parent' => 2),
* array('id' => 9, 'value' => '3-1-1', 'parent' => 3),
* array('id' => 10, 'value' => '3-1-1-1', 'parent' => 9),
* );
*
* $tree = ArrayHelper::tree($rows, 'id', 'parent', 'nodes');
*
* dump($tree);
* // 输出结果为:
* // array(
* // array('id' => 1, ..., 'nodes' => array()),
* // array('id' => 2, ..., 'nodes' => array(
* // array(..., 'parent' => 2, 'nodes' => array()),
* // array(..., 'parent' => 2, 'nodes' => array()),
* // ),
* // array('id' => 3, ..., 'nodes' => array(
* // array('id' => 9, ..., 'parent' => 3, 'nodes' => array(
* // array(..., , 'parent' => 9, 'nodes' => array(),
* // ),
* // ),
* // )
* @endcode
*
* 如果要获得任意节点为根的子树,可以使用 $refs 参数:
* @code php
* $refs = null;
* $tree = ArrayHelper::tree($rows, 'id', 'parent', 'nodes', $refs);
*
* // 输出 id 为 3 的节点及其所有子节点
* $id = 3;
* dump($refs[$id]);
* @endcode
*
* @param array $arr 数据源
* @param string $keyNodeId 节点ID字段名
* @param string $keyParentId 节点父ID字段名
* @param string $keyChildrens 保存子节点的字段名
* @param boolean $refs 是否在返回结果中包含节点引用
*
* return array 树形结构的数组
*/
static function toTree($arr, $keyNodeId, $keyParentId = 'parent_id', $keyChildrens = 'childrens', & $refs = NULL)
{
$refs = array();
foreach ($arr as $offset => $row)
{
$arr[$offset][$keyChildrens] = array();
$refs[$row[$keyNodeId]] =& $arr[$offset];
} $tree = array();
foreach ($arr as $offset => $row)
{
$parentId = $row[$keyParentId];
if ($parentId)
{
if (!isset($refs[$parentId]))
{
$tree[] =& $arr[$offset];
continue;
}
$parent =& $refs[$parentId];
$parent[$keyChildrens][] =& $arr[$offset];
}
else
{
$tree[] =& $arr[$offset];
}
}
return $tree;
} /**
* 将树形数组展开为平面的数组
*
* 这个方法是 tree() 方法的逆向操作。
*
* @param array $tree 树形数组
* @param string $keyChildrens 包含子节点的键名
*
* @return array 展开后的数组
*/
static function treeToArray($tree, $keyChildrens = 'childrens')
{
$ret = array();
if (isset($tree[$keyChildrens]) && is_array($tree[$keyChildrens]))
{
foreach ($tree[$keyChildrens] as $child)
{
$ret = array_merge($ret, self::treeToArray($child, $keyChildrens));
}
unset($node[$keyChildrens]);
$ret[] = $tree;
}
else
{
$ret[] = $tree;
}
return $ret;
}

好用的php类库和方法的更多相关文章

  1. Android Studio导入第三方类库的方法

    Android Studio导入第三方类库的方法 本人也刚刚开始尝试做android app的开发,听说android studio是Google支持的android 应用开发工具,所以想应该肯定比E ...

  2. laravel5.3引入第三方类库的方法

    laravel版本:5.3 今天做的是引入第三方的phpquery类库,方法: 在laravel的app目录下自定义一个文件夹,我用的名字是:Libs 然后直接将phpquery类库扔进这个目录 在c ...

  3. Android——Android Studio导入SlidingMenu类库的方法

    Android Studio导入SlidingMenu类库的方法(其他类库应该也适用)   本篇文章主要介绍了"Android Studio导入SlidingMenu类库的方法(其他类库应该 ...

  4. (华为机试大备战)java。多了解了解最常用的那个类库的方法对处理字符串的方法

    1.常考字符串处理:对处理字符串的方法. (a)统计字符串中特定字符的个数. 2.郭靖考了一道二维数组?? 3.多了解了解最常用的那个类库的方法.

  5. Android Studio导入第三方类库的方法(转)

    转自:链接 本人也刚刚开始尝试做android app的开发,听说android studio是Google支持的android 应用开发工具,所以想应该肯定比Eclipse好用吧,反正以前没有jav ...

  6. .NET MVC控制器分离到类库的方法

    在.ASP.NET MVC的开发中,我们创建完项目之后,ASP.NET MVC是已Model-Controller-View的形式存在的,在创建项目自动生成的内容上Model我们很容易分离成类库,所以 ...

  7. Android类库打包方法探究

    原文地址: http://www.cnblogs.com/wangchuanju/archive/2012/04/05/android_lib_jar.html 开发Android应用的时候,对于可用 ...

  8. 【PHP】 PHPqrCode二维码类库使用方法

    1.首先去官网下载PHPqrCode库文件,只需要里面的phpqrcode.php文件,下载地址:http://phpqrcode.sourceforge.net 2.二维码生成实例代码: <? ...

  9. IOS 编程中引用第三方的方类库的方法及常见问题

    方法一:直接复制全部源文件到项目中 这样的方法就是把第三方类库的全部源文件拷贝到项目中,直接把全部.h和.m文件拖到XCode项目中就可以. 注意: 1. 假设第三方类库引用了一些系统自带类库,那么在 ...

  10. 【转】.NET MVC控制器分离到类库的方法

    在.ASP.NET MVC的开发中,我们创建完项目之后,ASP.NET MVC是已Model-Controller-View的形式存在的,在创建项目自动生成的内容上Model我们很容易分离成类库,所以 ...

随机推荐

  1. 湖南附中模拟day1 收银员

    4.1 题意描述花花家的超市是 24 小时营业的,现在需要招聘收银员.超市每个小时都需要不同数量的收银员,用 ai 表示一天中 i 点到 i + 1 点这一小时内需要的收银员数量,特别地 a23 表示 ...

  2. 【PHP面向对象(OOP)编程入门教程】16.__toString()方法

    我们前面说过在类里面声明“__”开始的方法名的方法(PHP给我们提供的),都是在某一时刻不同情况下自动调用执行的方 法,“__toString()”方法也是一样自动被调用的,是在直接输出对象引用时自动 ...

  3. php面向对象面试题

    php面试题之四--PHP面向对象(基础部分) 四.PHP面向对象 1. 写出 php 的 public.protected.private 三种访问控制模式的区别(新浪网技术部) public:公有 ...

  4. Javascript高级程序设计——函数内部属性与函数属性

    函数内部属性 函数内部有两个特殊的属性arguments和this.其中,arguments是类数组对象,包含传入函数中的所有值,这个arguments还有一个属性:callee,这个属性是一个指针, ...

  5. CSS选择器的特殊性和LOVE HA

    在CSS中当几个相同的选择器对同一个元素有不同的规则时,该怎么应用这些规则呢? 答案就是:CSS特殊性(CSS specificity) 选择器特殊性有选择器本身组成,特殊性由4个数值表述:0, 0, ...

  6. android GestureDetector 手势基础

    1. 当用户触摸屏幕的时候,会产生许多手势,例如down,up,scroll,filing等等,我们知道View类有个View.OnTouchListener内部接口,通过重写他的onTouch(Vi ...

  7. 字符集与编码01--charset vs encoding

    声明:此文章转载自 http://my.oschina.net/goldenshaw/blog/304493 许多时候,字符集与编码这两个概念常被混为一谈,但两者是有差别的,作为深入理解的第一步,首先 ...

  8. HDU 5014 Number Sequence(位运算)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5014 解题报告:西安网赛的题,当时想到一半,只想到从大的开始匹配,做异或运算得到对应的b[i],但是少 ...

  9. 导航栏的坑 (导航透明/导航除线/titleIView)

    //以下四个条件缺一不可 /.必须是半透明状态 self.navigationBar.translucent = YES; //2.导航栏背景图片为空图片 (不可以设置backgroundColor或 ...

  10. Apache + Tomcat + mod_jk实现集群服务

    Tomcat中的集群原理是通过组播的方式进行节点的查找并使用TCP连接进行会话的复制. 实现效果:用apache 分发请求到tomcat中的对应的项目 环境说明: 操作系统:window xp Jav ...