PHP数组操作类实例

这篇文章主要介绍了PHP数组操作类,涉及php针对数组的删除、转换、分组、排序等相关操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下。

本文实例讲述了PHP数组操作类,分享给大家供大家参考,具体如下:

  1. class ArrayHelper{
  2. /**
  3. * 从数组中删除空白的元素(包括只有空白字符的元素)
  4. *
  5. * 用法:
  6. * @code php
  7. * $arr = array('', 'test', ' ');
  8. * ArrayHelper::removeEmpty($arr);
  9. *
  10. * dump($arr);
  11. * // 输出结果中将只有 'test'
  12. * @endcode
  13. *
  14. * @param array $arr 要处理的数组
  15. * @param boolean $trim 是否对数组元素调用 trim 函数
  16. */
  17. static function removeEmpty(& $arr, $trim = TRUE)
  18. {
  19. foreach ($arr as $key => $value)
  20. {
  21. if (is_array($value))
  22. {
  23. self::removeEmpty($arr[$key]);
  24. }
  25. else
  26. {
  27. $value = trim($value);
  28. if ($value == '')
  29. {
  30. unset($arr[$key]);
  31. }
  32. elseif ($trim)
  33. {
  34. $arr[$key] = $value;
  35. }
  36. }
  37. }
  38. }
  39. /**
  40. * 从一个二维数组中返回指定键的所有值
  41. *
  42. * 用法:
  43. * @code php
  44. * $rows = array(
  45. * array('id' => 1, 'value' => '1-1'),
  46. * array('id' => 2, 'value' => '2-1'),
  47. * );
  48. * $values = ArrayHelper::getCols($rows, 'value');
  49. *
  50. * dump($values);
  51. * // 输出结果为
  52. * // array(
  53. * // '1-1',
  54. * // '2-1',
  55. * // )
  56. * @endcode
  57. *
  58. * @param array $arr 数据源
  59. * @param string $col 要查询的键
  60. *
  61. * @return array 包含指定键所有值的数组
  62. */
  63. static function getCols($arr, $col)
  64. {
  65. $ret = array();
  66. foreach ($arr as $row)
  67. {
  68. if (isset($row[$col])) {
  69. $ret[] = $row[$col];
  70. }
  71. }
  72. return $ret;
  73. }
  74. /**
  75. * 将一个二维数组转换为 HashMap,并返回结果
  76. *
  77. * 用法1:
  78. * @code php
  79. * $rows = array(
  80. * array('id' => 1, 'value' => '1-1'),
  81. * array('id' => 2, 'value' => '2-1'),
  82. * );
  83. * $hashmap = ArrayHelper::toHashmap($rows, 'id', 'value');
  84. *
  85. * dump($hashmap);
  86. * // 输出结果为
  87. * // array(
  88. * // 1 => '1-1',
  89. * // 2 => '2-1',
  90. * // )
  91. * @endcode
  92. *
  93. * 如果省略 $valueField 参数,则转换结果每一项为包含该项所有数据的数组。
  94. *
  95. * 用法2:
  96. * @code php
  97. * $rows = array(
  98. * array('id' => 1, 'value' => '1-1'),
  99. * array('id' => 2, 'value' => '2-1'),
  100. * );
  101. * $hashmap = ArrayHelper::toHashmap($rows, 'id');
  102. *
  103. * dump($hashmap);
  104. * // 输出结果为
  105. * // array(
  106. * // 1 => array('id' => 1, 'value' => '1-1'),
  107. * // 2 => array('id' => 2, 'value' => '2-1'),
  108. * // )
  109. * @endcode
  110. *
  111. * @param array $arr 数据源
  112. * @param string $keyField 按照什么键的值进行转换
  113. * @param string $valueField 对应的键值
  114. *
  115. * @return array 转换后的 HashMap 样式数组
  116. */
  117. static function toHashmap($arr, $keyField, $valueField = NULL)
  118. {
  119. $ret = array();
  120. if ($valueField)
  121. {
  122. foreach ($arr as $row)
  123. {
  124. $ret[$row[$keyField]] = $row[$valueField];
  125. }
  126. }
  127. else
  128. {
  129. foreach ($arr as $row)
  130. {
  131. $ret[$row[$keyField]] = $row;
  132. }
  133. }
  134. return $ret;
  135. }
  136. /**
  137. * 将一个二维数组按照指定字段的值分组
  138. *
  139. * 用法:
  140. * @endcode
  141. *
  142. * @param array $arr 数据源
  143. * @param string $keyField 作为分组依据的键名
  144. *
  145. * @return array 分组后的结果
  146. */
  147. static function groupBy($arr, $keyField)
  148. {
  149. $ret = array();
  150. foreach ($arr as $row)
  151. {
  152. $key = $row[$keyField];
  153. $ret[$key][] = $row;
  154. }
  155. return $ret;
  156. }
  157. /**
  158. * 将一个平面的二维数组按照指定的字段转换为树状结构
  159. *
  160. *
  161. * 如果要获得任意节点为根的子树,可以使用 $refs 参数:
  162. * @code php
  163. * $refs = null;
  164. * $tree = ArrayHelper::tree($rows, 'id', 'parent', 'nodes', $refs);
  165. *
  166. * // 输出 id 为 3 的节点及其所有子节点
  167. * $id = 3;
  168. * dump($refs[$id]);
  169. * @endcode
  170. *
  171. * @param array $arr 数据源
  172. * @param string $keyNodeId 节点ID字段名
  173. * @param string $keyParentId 节点父ID字段名
  174. * @param string $keyChildrens 保存子节点的字段名
  175. * @param boolean $refs 是否在返回结果中包含节点引用
  176. *
  177. * return array 树形结构的数组
  178. */
  179. static function toTree($arr, $keyNodeId, $keyParentId = 'parent_id', $keyChildrens = 'childrens', & $refs = NULL)
  180. {
  181. $refs = array();
  182. foreach ($arr as $offset => $row)
  183. {
  184. $arr[$offset][$keyChildrens] = array();
  185. $refs[$row[$keyNodeId]] =& $arr[$offset];
  186. }
  187. $tree = array();
  188. foreach ($arr as $offset => $row)
  189. {
  190. $parentId = $row[$keyParentId];
  191. if ($parentId)
  192. {
  193. if (!isset($refs[$parentId]))
  194. {
  195. $tree[] =& $arr[$offset];
  196. continue;
  197. }
  198. $parent =& $refs[$parentId];
  199. $parent[$keyChildrens][] =& $arr[$offset];
  200. }
  201. else
  202. {
  203. $tree[] =& $arr[$offset];
  204. }
  205. }
  206. return $tree;
  207. }
  208. /**
  209. * 将树形数组展开为平面的数组
  210. *
  211. * 这个方法是 tree() 方法的逆向操作。
  212. *
  213. * @param array $tree 树形数组
  214. * @param string $keyChildrens 包含子节点的键名
  215. *
  216. * @return array 展开后的数组
  217. */
  218. static function treeToArray($tree, $keyChildrens = 'childrens')
  219. {
  220. $ret = array();
  221. if (isset($tree[$keyChildrens]) && is_array($tree[$keyChildrens]))
  222. {
  223. foreach ($tree[$keyChildrens] as $child)
  224. {
  225. $ret = array_merge($ret, self::treeToArray($child, $keyChildrens));
  226. }
  227. unset($node[$keyChildrens]);
  228. $ret[] = $tree;
  229. }
  230. else
  231. {
  232. $ret[] = $tree;
  233. }
  234. return $ret;
  235. }
  236. /**
  237. * 根据指定的键对数组排序
  238. *
  239. * @endcode
  240. *
  241. * @param array $array 要排序的数组
  242. * @param string $keyname 排序的键
  243. * @param int $dir 排序方向
  244. *
  245. * @return array 排序后的数组
  246. */
  247. static function sortByCol($array, $keyname, $dir = SORT_ASC)
  248. {
  249. return self::sortByMultiCols($array, array($keyname => $dir));
  250. }
  251. /**
  252. * 将一个二维数组按照多个列进行排序,类似 SQL 语句中的 ORDER BY
  253. *
  254. * 用法:
  255. * @code php
  256. * $rows = ArrayHelper::sortByMultiCols($rows, array(
  257. * 'parent' => SORT_ASC,
  258. * 'name' => SORT_DESC,
  259. * ));
  260. * @endcode
  261. *
  262. * @param array $rowset 要排序的数组
  263. * @param array $args 排序的键
  264. *
  265. * @return array 排序后的数组
  266. */
  267. static function sortByMultiCols($rowset, $args)
  268. {
  269. $sortArray = array();
  270. $sortRule = '';
  271. foreach ($args as $sortField => $sortDir)
  272. {
  273. foreach ($rowset as $offset => $row)
  274. {
  275. $sortArray[$sortField][$offset] = $row[$sortField];
  276. }
  277. $sortRule .= '$sortArray[\'' . $sortField . '\'], ' . $sortDir . ', ';
  278. }
  279. if (emptyempty($sortArray) || emptyempty($sortRule)) {
  280. return $rowset;
  281. }
  282. eval('array_multisort(' . $sortRule . '$rowset);');
  283. return $rowset;
  284. }
  285. }