2016年05月31日 16:53:20

PHP数组无限级分组

作者: 

前几天A哥(@Ares)出了一个牛逼的函数,第一眼看过去,一脸懵逼;再看看运行结果,初见端倪;终于,还是忍不住仔细研读,也附带上自己的注释,经A哥许可转发到这里,大家一起欣赏欣赏。

  1. <?php
  2. /**
  3. * PHP数组无限级分组
  4. * @baseFrom http://blog.phpdr.net/php%E6%97%A0%E6%9E%81%E5%88%86%E7%BB%84.html
  5. *
  6. * @param array $list 数据源
  7. * @param mixed $columns 最内层需要提取数据的字段
  8. * @param mixed $group 分组 如果为空,不分组; 如果为数组,多个值按顺序分别作为多维数组键值
  9. * @param mixed $primary 主键 如果为空,以数字为键值;如果为数组,以多个值拼接作为键值
  10. * @return array
  11. */
  12. function dict(array $list, $columns = null, $group = null, $primary = null) {
  13. if (! isset ( $primary )) {
  14. $primary = array ();
  15. }
  16. if (is_string ( $primary )) {
  17. $primary = array (
  18. $primary
  19. );
  20. }
  21. if (is_string ( $group )) {
  22. $group = array (
  23. $group
  24. );
  25. }
  26. $listNew = array ();
  27. foreach ( $list as $v ) {
  28. //如果指定主键,拼接主键
  29. $key = null;
  30. foreach ( $primary as $p ) {
  31. $key .= $v [$p];
  32. }
  33. //提取字段
  34. if (isset ( $columns )) {
  35. //$columns = array(null) 提取字段结果为null
  36. if (is_array ( $columns ) && 1 === count ( $columns ) && $columns [0] === null) {
  37. $vNew = null;
  38. } else {
  39. $vNew = array ();
  40. if (is_array ( $columns )) {
  41. //$columns = array('col1', 'col2') 循环提取字段,若数组为空,则提取字段结果为空数组
  42. foreach ( $columns as $k1 => $v1 ) {
  43. if (is_int ( $k1 )) {
  44. $k1 = $v1;
  45. }
  46. $vNew [$k1] = $v [$v1];
  47. }
  48. } else {
  49. $vNew = $v [$columns];
  50. }
  51. }
  52. } else { //$columns = null 提取所有字段
  53. $vNew = $v;
  54. }
  55. //切换数据存储位置到指定分组
  56. if (isset ( $group )) {
  57. $vGroup = &$listNew;
  58. //遍历分组
  59. foreach ( $group as $v2 ) {
  60. //分组不存在,设置为空数组
  61. if (!isset ( $vGroup[$v [$v2]] )) {
  62. $vGroup [$v [$v2]] = array ();
  63. }
  64. //当前分组切换到新位置
  65. $vGroup = &$vGroup [$v [$v2]];
  66. }
  67. //指定主键,用主键为键值存储字段信息
  68. if (isset ( $key )) {
  69. $vGroup [$key] = $vNew;
  70. } else { //未指定主键,以索引数组存储字段信息
  71. $vGroup [] = $vNew;
  72. }
  73. } else {
  74. //指定主键,用主键为键值存储字段信息
  75. if (isset ( $key )) {
  76. $listNew [$key] = $vNew;
  77. } else { //未指定主键,以索引数组存储字段信息
  78. $listNew [] = $vNew;
  79. }
  80. }
  81. }
  82. return $listNew;
  83. }
  84. //示例
  85. $list = array ();
  86. $list [] = array (
  87. 'id' => 1,
  88. 'name' => '学生1',
  89. 'school' => '学校1',
  90. 'class' => '班级1'
  91. );
  92. $list [] = array (
  93. 'id' => 4,
  94. 'name' => '学生4',
  95. 'school' => '学校2',
  96. 'class' => '班级2'
  97. );
  98. $list [] = array (
  99. 'id' => 2,
  100. 'name' => '学生2',
  101. 'school' => '学校1',
  102. 'class' => '班级2'
  103. );
  104. $list [] = array (
  105. 'id' => 3,
  106. 'name' => '学生3',
  107. 'school' => '学校2',
  108. 'class' => '班级1'
  109. );
  110. $list [] = array (
  111. 'id' => 5,
  112. 'name' => '学生5',
  113. 'school' => '学校2',
  114. 'class' => '班级3'
  115. );
  116. //源数组
  117. print_r($list);
  118. //1. 提取name字段
  119. print_r ( dict ( $list, 'name' ) );
  120. //2. 提取空字段(数据项为null)
  121. var_dump ( dict ( $list, array (
  122. null
  123. ) ) );
  124. //3. 提取空字段(数据项为array)
  125. var_dump ( dict ( $list, array () ) );
  126. //4. 提取多个指定字段,以id为主键
  127. print_r ( dict ( $list, array (
  128. 'id',
  129. 'name',
  130. 'school'
  131. ), null, 'id' ) );
  132. //5. 指定两个字段拼接为主键,提取所有字段
  133. print_r ( dict ( $list, null, null, array (
  134. 'class',
  135. 'name'
  136. ) ) );
  137. //6. 以school为分组,以id为主键,提取name字段
  138. print_r ( dict ( $list, array (
  139. 'name'
  140. ), 'school', 'id' ) );
  141. //7. 以school和class为分组,以id为主键,提取name字段
  142. print_r ( dict ( $list, array (
  143. 'name'
  144. ), array (
  145. 'school',
  146. 'class'
  147. ), 'id' ) );
  148. //8. 无限级重组演示(数据源比较单薄,暂且这么演示)
  149. print_r ( dict ( $list, array (
  150. 'name'
  151. ), array (
  152. 'school',
  153. 'class',
  154. 'school',
  155. 'class',
  156. 'school',
  157. 'class',
  158. ), 'id' ) );

源码:PHP无限级分组(注释版)

运行结果:PHP无限级分组(注释版)

原文见PHP无限级分组



未经同意禁止转载!
转载请附带本文原文地址:PHP数组无限级分组,首发自 Zjmainstay学习笔记
阅读( 1614 )
看完顺手点个赞呗:
(8 votes)

1.PHP cURL群:PHP cURL高级技术
2.正则表达式群:专精正则表达式
3. QQ联系(加请说明):QQ联系博主(951086941)
4. 邮箱:zjmainstay@163.com
5. 打赏博主:

  1. 模拟登录后数据采集
  2. 网页内容数据采集
  3. 采集内容正则解析
  4. 数据采集难题咨询

阿里云幸运券分享
网站总访问量: