php教程

超轻量级php框架startmvc

PHP实现的操作数组类库定义与用法示例

更新时间:2020-04-05 09:21:06 作者:startmvc
本文实例讲述了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 (empty($sortArray) || empty($sortRule)) {
 return $rowset;
 }
 eval('array_multisort(' . $sortRule . '$rowset);');
 return $rowset;
 }
}
?>

用法示例:

从数组中删除空白的元素(包括只有空白字符的元素)

用法:


$arr = array('', 'test', ' ');
ArrayHelper::removeEmpty($arr);
var_dump($arr);

输出结果中将只有 'test'

array(1) {   [1]=>   string(4) "test" }

PHP 操作数组 类库