php合并相同数组的数组
我有一个php数组:php合并相同数组的数组,php,arrays,array-merge,Php,Arrays,Array Merge,我有一个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" =
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这样的位置尝试,但没有结果。被事情分散了注意力。要么用Bhaskar的答案要么用我的。。。或者把它们结合起来
$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>";
试试array\u Column可能是重复的你能发布json\u encode$array吗?这样我就能很快写出一些代码了?@Dimi这是json\u encode:[{tab:9,布局\u id:11,横幅\u id:7},{tab:9,布局\u id:11,横幅\u id:null},{tab tab:10,布局\u id:null,横幅\u id:null},{tab 11,布局\u id:null},{tab 12,布局\u id:null,横幅\u id:null]@艾哈迈德:我不知道array_column在这种情况下能帮我什么忙
<?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);
// 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