一个数组转换问题...看着挺简单的,但是转换不了

array 
  0 => 
    array
      'ads' => 1
      'source' => 2
      'activate' => 1
  1 => 
    array
      'ads' => 1
      'source' => 3
      'activate' => 1
  2 => 
    array
      'ads' => 1
      'source' => 2
      'reg' => 1
  3 => 
    array
      'ads' => 1
      'source' => 3
      'reg' => 1
  4 => 
    array
      'ads' => 2
      'source' => 1
      'reg' => 1

请问像这种数组有办法转换成下面这种吗,就是将数组中的ads和source相同的合并

array
     0 => 
        array 
          'ads' => 1
          'source' => 2
          'activate' => 1
          'reg' => 1
      1 => 
        array 
          'ads' => 1
          'source' => 3
          'activate' => 1
          'reg' => 1
      2 => 
        array 
          'ads' => 2
          'source' => 1
          'reg' => 1
houmuxu
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
ruke
最佳答案

laravel的话

        return array_values(
            collect($arr)
                ->groupBy('source')
                ->map(function ($item) {
                    return array_merge(...$item);
                })
        );

纠正一下,没看清题目, 要是根据asdsource 一起的话是这样写

$data = collect($arr)->groupBy(function ($item) {
                    return $item['ads']. '_' . $item['source'];
                })
                ->map(function ($item) {
                    return array_merge(...$item);
                })->toArray();
        return array_values($data);

原始代码这么写也挺简单的

$ret = [];
foreach ($arr as $item) {
    $key = $item['ads'] . '_' . $item['source'];
    if (isset($ret[$key])) {
        $ret[$key] = array_merge($ret[$key], $item);
    } else {
        $ret[$key] = $item;
    }
}
return array_values($ret);
5年前 评论
讨论数量: 4

用最简单粗暴的 :foreach(数组 as $k=>$v){
if(判断是否相同){
array_merge()
}
}
嗯大致就这样

5年前 评论

emmm,机智
$result = [];
foreach ($arr as $item) {
$result[$item['ads'] . $item['source']][] = $item;
}

return array_values($result);

5年前 评论
ruke

laravel的话

        return array_values(
            collect($arr)
                ->groupBy('source')
                ->map(function ($item) {
                    return array_merge(...$item);
                })
        );

纠正一下,没看清题目, 要是根据asdsource 一起的话是这样写

$data = collect($arr)->groupBy(function ($item) {
                    return $item['ads']. '_' . $item['source'];
                })
                ->map(function ($item) {
                    return array_merge(...$item);
                })->toArray();
        return array_values($data);

原始代码这么写也挺简单的

$ret = [];
foreach ($arr as $item) {
    $key = $item['ads'] . '_' . $item['source'];
    if (isset($ret[$key])) {
        $ret[$key] = array_merge($ret[$key], $item);
    } else {
        $ret[$key] = $item;
    }
}
return array_values($ret);
5年前 评论
houmuxu

@ruke 大佬很细节

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!