【问题标题】:php merge arrays of the same arrayphp合并同一数组的数组
【发布时间】:2017-03-15 14:12:20
【问题描述】:

我在 php 中有这个数组:

array:5 [
  0 => array:3 [
    "tab" => "9"
    "layout_id" => "11"
    "banners_ids" => "7"
  ]
  1 => array:3 [
    "tab" => "9"
    "layout_id" => "11"
    "banners_ids" => "8"
  ]
  2 => array:3 [
    "tab" => "10"
    "layout_id" => null
    "banners_ids" => null
  ]
  3 => array:3 [
    "tab" => "11"
    "layout_id" => null
    "banners_ids" => null
  ]
  4 => array:3 [
    "tab" => "12"
    "layout_id" => null
    "banners_ids" => null
  ]
]

并且我需要将具有相同“tab”键的那些合并到同一个数组中以具有这样的内容:

array:5 [
  0 => array:3 [
    "tab" => "9"
    "layout_id" => "11"
    "banners_ids" => "8,7"
  ]
  1 => array:3 [
    "tab" => "10"
    "layout_id" => null
    "banners_ids" => null
  ]
  2 => array:3 [
    "tab" => "11"
    "layout_id" => null
    "banners_ids" => null
  ]
  3 => array:3 [
    "tab" => "12"
    "layout_id" => null
    "banners_ids" => null
  ]
]

我怎样才能做到这一点?我尝试使用 foreach 和诸如 current() 或 prev() 之类的位置,但没有结果。

【问题讨论】:

  • 试试array_column
  • 你能发布 json_encode($array) 以便我可以快速编写一些代码吗?
  • @Dimi 这是 json_encode:[{"tab":"9","layout_id":"11","banners_ids":"7"},{"tab":"9","layout_id":"11","banners_ids":"8"},{"tab":"10","layout_id":null,"banners_ids":null},{"tab":"11","layout_id":null,"banners_ids":null},{"tab":"12","layout_id":null,"banners_ids":null}]
  • @Ahmad 我不知道在这种情况下 array_column 可以如何帮助我

标签: php arrays array-merge


【解决方案1】:

被事情分心了。要么使用 Bhaskar 的答案或我的答案......要么将它们结合起来。

<?php

$array=json_decode('[{"tab":"9","layout_id":"11","banners_ids":"7"},{"tab":"9","layout_id":"11","banners_ids":"8"},{"tab":"10","layout_id":null,"banners_ids":null},{"tab":"11","layout_id":null,"banners_ids":null},{"tab":"12","layout_id":null,"banners_ids":null}]',true);


//var_dump($array);
$new_array=array();
foreach($array as $entry)
{
$new_array[$entry['tab']]['tab']=$entry['tab'];
$new_array[$entry['tab']]['layout_id']=$entry['layout_id'];
$new_array[$entry['tab']]['banners_ids'][]=$entry['banners_ids'];
}

foreach($new_array as $key=>$val)
{
$new_array[$key]['banners_ids']=implode(',',$new_array[$key]['banners_ids']);
}

var_dump($new_array);

【讨论】:

    【解决方案2】:
    $finala = $c = $arr;
    echo "<pre>"; print_r($finala);echo "</pre>";
    foreach($arr as $ke=>$ss){
    foreach($c as $k => $cc){
        if($ke == $k) continue;
        if($ss['tab'] == $cc['tab']){            
            $finala[$ke]['tab'] = $ss['tab'];
            $finala[$ke]['layout_id'] = $ss['layout_id'];
            $finala[$ke]['banners_ids'] = implode(',', array( $cc['banners_ids'],$ss['banners_ids']));
            unset($finala[$k]);
        }
    }
    }
    ksort($finala);
    echo "<pre>"; print_r($finala);echo "</pre>";
    

    【讨论】:

      【解决方案3】:
      // Manual sort by tab value
      usort($array, function($a, $b){
          return $a['tab'] - $b['tab'];
      });
      
      $serve = -1;
      $merge = array();
      foreach ($array as $value) {
          $tab_position = array_search($value['tab'], array_column($array,'tab')); // find same tab value position
      
          if($tab_position > $serve) $serve = $tab_position;
      
          if($tab_position == $serve){
              $merge[$tab_position]['tab'] = $value['tab'];
              $merge[$tab_position]['layout_id'] = $value['layout_id']; // if you want to merge layout_id as well, do as below
              $merge[$tab_position]['banners_ids'] = !isset($merge[$tab_position]['banners_ids']) ? 
                                                      $value['banners_ids'] : 
                                                      $merge[$tab_position]['banners_ids'].','.$value['banners_ids'];
      
              $merge[$tab_position]['banners_ids'] = rtrim($merge[$tab_position]['banners_ids'], ','); // remove extre comma (.)
      
          }
      }
      
      print_r($merge); // output
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-25
        • 2019-10-08
        • 1970-01-01
        相关资源
        最近更新 更多