PHP数组操作类
class
ArrayHelper{
/**
* 从数组中删除空白的元素(包括只有空白字符的元素)
*
* 用法:
* @code php
* $arr = array('', 'test', ' ');
* ArrayHelper::removeEmpty($arr);
*
* dump($arr);
* // 输出结果中将只有 'test'
* @endcode
*
* @param array $arr 要处理的数组
* @param boolean $trim 是否对数组元素调用 trim 函数
*/
static
function
removeEmpty(&
$arr
,
$trim
= TRUE)
{
foreach
(
$arr
as
$key
=>
$value
)
{
if
(
is_array
(
$value
))
{
self::removeEmpty(
$arr
[
$key
]);
}
else
{
$value
= trim(
$value
);
if
(
$value
==
''
)
{
unset(
$arr
[
$key
]);
}
elseif
(
$trim
)
{
$arr
[
$key
] =
$value
;
}
}
}
}
/**
* 从一个二维数组中返回指定键的所有值
*
* 用法:
* @code php
* $rows = array(
* array('id' => 1, 'value' => '1-1'),
* array('id' => 2, 'value' => '2-1'),
* );
* $values = ArrayHelper::getCols($rows, 'value');
*
* dump($values);
* // 输出结果为
* // array(
* // '1-1',
* // '2-1',
* // )
* @endcode
*
* @param array $arr 数据源
* @param string $col 要查询的键
*
* @return array 包含指定键所有值的数组
*/
static
function
getCols(
$arr
,
$col
)
{
$ret
=
array
();
foreach
(
$arr
as
$row
)
{
if
(isset(
$row
[
$col
])) {
$ret
[] =
$row
[
$col
];
}
}
return
$ret
;
}
/**
* 将一个二维数组转换为 HashMap,并返回结果
*
* 用法1:
* @code php
* $rows = array(
* array('id' => 1, 'value' => '1-1'),
* array('id' => 2, 'value' => '2-1'),
* );
* $hashmap = ArrayHelper::toHashmap($rows, 'id', 'value');
*
* dump($hashmap);
* // 输出结果为
* // array(
* // 1 => '1-1',
* // 2 => '2-1',
* // )
* @endcode
*
* 如果省略 $valueField 参数,则转换结果每一项为包含该项所有数据的数组。
*
* 用法2:
* @code php
* $rows = array(
* array('id' => 1, 'value' => '1-1'),
* array('id' => 2, 'value' => '2-1'),
* );
* $hashmap = ArrayHelper::toHashmap($rows, 'id');
*
* dump($hashmap);
* // 输出结果为
* // array(
* // 1 => array('id' => 1, 'value' => '1-1'),
* // 2 => array('id' => 2, 'value' => '2-1'),
* // )
* @endcode
*
* @param array $arr 数据源
* @param string $keyField 按照什么键的值进行转换
* @param string $valueField 对应的键值
*
* @return array 转换后的 HashMap 样式数组
*/
static
function
toHashmap(
$arr
,
$keyField
,
$valueField
= NULL)
{
$ret
=
array
();
if
(
$valueField
)
{
foreach
(
$arr
as
$row
)
{
$ret
[
$row
[
$keyField
]] =
$row
[
$valueField
];
}
}
else
{
foreach
(
$arr
as
$row
)
{
$ret
[
$row
[
$keyField
]] =
$row
;
}
}
return
$ret
;
}
/**
* 将一个二维数组按照指定字段的值分组
*
* 用法:
* @endcode
*
* @param array $arr 数据源
* @param string $keyField 作为分组依据的键名
*
* @return array 分组后的结果
*/
static
function
groupBy(
$arr
,
$keyField
)
{
$ret
=
array
();
foreach
(
$arr
as
$row
)
{
$key
=
$row
[
$keyField
];
$ret
[
$key
][] =
$row
;
}
return
$ret
;
}
/**
* 将一个平面的二维数组按照指定的字段转换为树状结构
*
*
* 如果要获得任意节点为根的子树,可以使用 $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
;
}
/**
* 根据指定的键对数组排序
*
* @endcode
*
* @param array $array 要排序的数组
* @param string $keyname 排序的键
* @param int $dir 排序方向
*
* @return array 排序后的数组
*/
static
function
sortByCol(
$array
,
$keyname
,
$dir
= SORT_ASC)
{
return
self::sortByMultiCols(
$array
,
array
(
$keyname
=>
$dir
));
}
/**
* 将一个二维数组按照多个列进行排序,类似 SQL 语句中的 ORDER BY
*
* 用法:
* @code php
* $rows = ArrayHelper::sortByMultiCols($rows, array(
* 'parent' => SORT_ASC,
* 'name' => SORT_DESC,
* ));
* @endcode
*
* @param array $rowset 要排序的数组
* @param array $args 排序的键
*
* @return array 排序后的数组
*/
static
function
sortByMultiCols(
$rowset
,
$args
)
{
$sortArray
=
array
();
$sortRule
=
''
;
foreach
(
$args
as
$sortField
=>
$sortDir
)
{
foreach
(
$rowset
as
$offset
=>
$row
)
{
$sortArray
[
$sortField
][
$offset
] =
$row
[
$sortField
];
}
$sortRule
.=
'$sortArray[\''
.
$sortField
.
'\'], '
.
$sortDir
.
', '
;
}
if
(
empty
(
$sortArray
) ||
empty
(
$sortRule
)) {
return
$rowset
;
}
eval
(
'array_multisort('
.
$sortRule
.
'$rowset);'
);
return
$rowset
;
}
}
PHP数组操作类的更多相关文章
- php 数组操作类(整合 给意见)
数组操作函数整理: /* 将一个二维数组按照指定字段的值分组 * * @param array $arr * @param string $keyField * * @return array */ ...
- jQuery自定义数组操作类(类似于List集合的增删改查)
js外部文件,前提需要引入jquery类库. 封装类代码如下: (function ($) { $.List = function () { var _list = new A ...
- Java数组操作类
最近又重新在看慕课网的数据结构,然后把示例代码整理一下. public class Array<E> { private E[] data; private int count = 0; ...
- 菜鸡的Java笔记 实践 - java 数组操作
讲解一个继承的实现思路 要求定义一个数组操作类(Array类),在这个类里面可以进行整型数组的操作,由外部传入数组的大小 ,并且要求实现数据的保存以及数据的 ...
- JQuery操作类数组的工具方法
JQuery学习之操作类数组的工具方法 在很多时候,JQuery的$()函数都返回一个类似数据的JQuery对象,例如$('div')将返回div里面的所有div元素包装的JQuery对象.在这中情况 ...
- jQuery_03之事件、动画、类数组操作
一.事件: 1.模式触发事件: ①DOM:elem.onXXX();只能触发直接用onXXX绑定的事件处理函数:用addEventistener添加的事件监听无法模拟出发触发: ②jQuery:$ ...
- PHP多维数组元素操作类
我的框架里面一个多维数组元素操作类,主要用于读取数组中配置数据,可以通过字符串节点的方式:a.b.c 来获取和设置元素,以及多维数组的覆盖,有需求的可以参考下吧! <?php /** * Cre ...
- C++走向远洋——38(用对象数组操作长方柱类)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:changfangzhu.cpp * 作者:常轩 * 微信公众号 ...
- 【知识必备】ezSQL,最好用的数据库操作类,让php操作sql更简单~
最近用php做了点小东东,用上了ezSQL,感觉真的很ez,所以拿来跟大家分享一下~ ezSQL是一个非常好用的PHP数据库操作类.著名的开源博客WordPress的数据库操作就使用了ezSQL的My ...
随机推荐
- linux_utf
LANG=en_US.utf8 export LC_ALL=en_US.utf8
- Linux内核模块管理命令
1.insmod命令 在Linux系统下,insmod命令用于将给定的模块加载到内核中去,Linux系统有许多功能是通过模块的方式,在需要时才载入kernel,这样做可以使kernel较为精简,进而提 ...
- [转帖]从 SOA 到微服务,企业分布式应用架构在云原生时代如何重塑?
从 SOA 到微服务,企业分布式应用架构在云原生时代如何重塑? 2019-10-08 10:26:28 阿里云云栖社区 阅读数 54 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权 ...
- http://www.cnblogs.com/xdp-gacl/p/4200090.html
孤傲苍狼 只为成功找方法,不为失败找借口! JavaWeb学习总结(五十)——文件上传和下载 在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功 ...
- windows10结束进程
.net winfrom 程序关于结束进程触发事件 在任务管理器中有进程.详细信息栏 在进程栏对应用程序结束任务,会触发应用程序窗体的FormClosed事件 在详细信息栏对应用程序结束任务,不会触发 ...
- 2019 吉比特java面试笔试题 (含面试题解析)
本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.吉比特等公司offer,岗位是Java后端开发,因为发展原因最终选择去了吉比特,入职一年时间了,也成为了面试官 ...
- Python进阶----多表查询(内连,左连,右连), 子查询(in,带比较运算符)
Python进阶----多表查询(内连,左连,右连), 子查询(in,带比较运算符) 一丶多表查询 多表连接查询的应用场景: 连接是关系数据库模型的主要特点,也是区别于其他 ...
- statsvn使用小记
准备工作 1.安装TortoiseSVN,在安装时需要安装svn命令行工具: 2.拉取svn代码: svn co https://svn.myserver.cn/svn/myproject1\trun ...
- spark源码阅读--shuffle过程分析
ShuffleManager(一) 本篇,我们来看一下spark内核中另一个重要的模块,Shuffle管理器ShuffleManager.shuffle可以说是分布式计算中最重要的一个概念了,数据的j ...
- Vue相关知识点记录
1.安装 vue不支持ie8以下版本(无法模拟ECMAScript5特性),支持所有兼容ECMAScript5的浏览器. 浏览器安装Vue Devtools, 可以在更友好的界面中审查和调试Vue应用 ...