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. 学习(主题或切入点)checklist1

    业务+技术+架构+运维+管理 技术学习:http://www.runoob.com/mongodb/mongodb-query.html 一.技术篇​补充学习列表 1,mongodb(o) 2,red ...

  2. oracle 行列转换的运用

    问题: 员工表: A(E_ID,NAME,) 部门表:  B(D_ID,D_NAME) 员工与部门关系:C(ID,E_ID,D_ID) SELECT  A.E_ID,A.NAME ,B.D_NAME ...

  3. maven工程通过命令打包

    dos下cd到pom.xml所在的目录,输入maven命令:mvn clean package,回车即可. 会打成一个.war包在target文件夹下.

  4. python 环境安装

    wget http://www.python.org/ftp/python/2.7.3/Python-2.7.3.tgz  tar zxf Python-2.7.3.tgz  cd Python-2. ...

  5. RHEL/CentOS 7最小化安装后需做的30件事情

    导读 CentOS是一个工业标准的Linux发行版,是红帽企业版 Linux 的衍生版本.你安装完后马上就可以使用,但是为了更好地使用你的系统,你需要进行一些升级.安装新的软件包.配置特定服务和应用程 ...

  6. caffe学习系列(1):图像数据转换成db(leveldb/lmdb)文件

    参考:http://www.cnblogs.com/denny402/p/5082341.html 上述博文用caffe自带的两张图片为例,将图片转为db格式.博主对命令参数进行了详细的解释,很赞. ...

  7. win10与ubantu双系统产生的引导错误问题-----unknown filesystem

    在win10和ubantu双系统中开机启动时出现unknown filesystem的解决办法   出现上述问题是引导区出错了. 方法如下: grub rescue>ls grub rescue ...

  8. 如何修复IIS7

    修复错误 运行命令提示符 fsutil resource setautoreset true c:\     打开运行输入 services.msc     启动Windows Process Act ...

  9. htpasswd命令

    htpasswd命令是Apache的Web服务器内置工具,用于创建和更新储存用户名.域和用户基本认证的密码文件. 语法 htpasswd(选项)(参数) 选项 -c:创建一个加密文件:-n:不更新加密 ...

  10. ThinkPHP在Ubuntu上 : mkdir的使用

    问题: 环境:Ubuntu系统,xampp1.8.3-5建站工具 描述:以root的身份运行.Apache的 DocumentRoot = "/var/www" .thinkphp ...