首页 > 开发 > PHP > 正文

PHP数组操作类实例

2024-05-04 23:37:42
字体:大 中 小
来源:转载
供稿:网友

这篇文章主要介绍了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 (empty($sortArray) || empty($sortRule)) { 
  280. return $rowset; 
  281. } 
  282. eval('array_multisort(' . $sortRule . '$rowset);'); 
  283. return $rowset; 
  284. } 
  285. } 

希望本文所述对大家的php程序设计有所帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表