php二维数组的合并2种方法

昨天还写了一篇关于数组合并的技术文章,那里我介绍的是一维数组合并,这里介绍一下php二维数组的合并方法,希望对各位同学会有所帮助哦。

例1:自定义方法合并数组,先看一个二维数组,代码如下:

  1. <?php
  2. Array (
  3. [0] => Array (
  4. [A] => store_name
  5. [B] => 商店一
  6. )
  7. [1] => Array (
  8. [A] => store_owner
  9. [B] => 小风
  10. )
  11. [2] => Array (
  12. [A] => store_name
  13. [B] => 商店二
  14. )
  15. [3] => Array (
  16. [A] => store_owner
  17. [B] => 小磊
  18. )
  19. ?>

大家会发现里面有两个 store_name 和 store_owner,所以我想让他们合并成下面这样

  1. <?php
  2. Array (
  3. [0] => Array
  4. (
  5. [A] => 商店一
  6. [B] => 小风
  7. )
  8. [1] => Array
  9. (
  10. [A] => 商店二
  11. [B] => 小磊
  12. )
  13. ?>

合并方法如下,代码如下:

  1. <?php
  2. $stores = array(); //定义一个空数组
  3. $store_count=count($showinfo); //统计显示的次数,这里的$showinfo是我获取数据库内容时的一个变量,然后打印出来就是上面刚开始的样子
  4. for($i=0;$i<$store_count;$i++)
  5. {
  6. $j=$i+1; //将 $i 加 1 跳过 一级 相当于 $j 取得是 键值为 奇数的值
  7. $stores[]=array(
  8. 'name' =>$showinfo[$i]['value'],
  9. 'owner'=>$showinfo[$j]['value'],
  10. );
  11. $i = $j; // 这里的作用是 相当于 $i 取得是 键值为 偶数的值
  12. }
  13. ?>

这样就可以得到上面的结果了,为了让大家看的更清楚些,我把数据库表结构写出来,主要字段如下:

  1. key value
  2. store_name 网店一
  3. store_owner 小风
  4. store_name 网店二
  5. store_owner 小磊

通过上面的方法做过后,前台页面就可以以一排的方式显示了,如下

  1. name owner
  2. 网店一 小风
  3. 网店二 小磊

例2,代码如下:

  1. <?php
  2. $arr = array
  3. (
  4. 0 => array(
  5. '1@01,02',
  6. '2@01,02',
  7. '4@ALL',
  8. '3@01',
  9. '5@01,02,04',
  10. ),
  11. 1 => array(
  12. '1@01,02,03',
  13. '2@01,02,04',
  14. '3@ALL',
  15. '4@01,02',
  16. '111@01,05',
  17. '5@03',
  18. ),
  19. 2 => array(
  20. '1@01,02,03',
  21. '2@02,03,05',
  22. '3@ALL',
  23. '4@01,02,03',
  24. '111@01,05',
  25. '5@03',
  26. ),
  27. );
  28. $result = array();
  29. foreach($arr as $items){
  30. if(is_array($items)){
  31. foreach($items as $item){
  32. $item = explode('@', $item);
  33. if(count($item) != 2){
  34. continue ;
  35. }
  36. $result[$item[0]] .= $item[1].',';
  37. }
  38. }
  39. }
  40. function reJoin(&$item,$key,$seq){
  41. $list = array_unique(explode($seq,$item));
  42. if (in_array('ALL', $list)){
  43. $item = $key.'@ALL';
  44. }else{
  45. $item = $key.'@'.join($seq,$list);
  46. }
  47. }
  48. array_walk($result, 'reJoin',',');
  49. sort($result);
  50. var_export($result);
  51. /**
  52. * array (
  53. * 0 => '111@01,05,',
  54. * 1 => '1@01,02,03,',
  55. * 2 => '2@01,02,04,03,05,',
  56. * 3 => '3@ALL',
  57. * 4 => '4@ALL',
  58. * 5 => '5@01,02,04,03,',
  59. * )
  60. */
  61. ?>