PHP数组操作类实例
这篇文章主要介绍了PHP数组操作类,涉及php针对数组的删除、转换、分组、排序等相关操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下。
本文实例讲述了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 (emptyempty($sortArray) || emptyempty($sortRule)) {
- return $rowset;
- }
- eval('array_multisort(' . $sortRule . '$rowset);');
- return $rowset;
- }
- }