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
;
}
}
管理好自己的情绪,你就是优雅的,控制好自己的心态,你就是成功的。