【问题标题】:How to combine array with same values如何组合具有相同值的数组
【发布时间】:2021-12-29 13:28:23
【问题描述】:

好吧,所以不能 100% 确定如何正确地问这个问题,但我有一个数组,我试图根据每小时合并和分组,然后是该时间之下每年的数据。

我当前的数组如下所示:

[
  {
    "name": "7:00 AM",
    "data": [
      {
        "x": "2019",
        "y": 1
      }
    ]
  }, 
  {
    "name": "7:00 AM",
    "data": [
      {
        "x": "2020",
        "y": 221
      }
    ]
  }
]

所以我希望根据name 值将它们组合成一个数组,然后将所有data 组合起来:

[
  {
    "name": "7:00 AM",
    "data": [
      {
        "x": "2019",
        "y": 1
      },
      {
        "x": "2020",
        "y": 221
      }
    ]
  }
]

编辑:为了添加我最初获取和格式化这些值的方式,我正在使用 Larvel 并运行以下查询:

$shipments = Orders::whereNotNull('shipped_at')->groupBy(DB::raw('YEAR(created_at)'))->selectRaw('count(*) as count, HOUR(shipped_at) as hour')->selectRaw("DATE_FORMAT(created_at, '%Y') label")->orderBy('label')->orderBy('hour')->groupBy('hour')->get();

这给了我以下数据:

然后我像这样构建原始数组:

$shipping_chart_year = [];
    foreach ($shipments as $item) {
        $hour = Carbon::parse($item['hour'] . ':00:00')->timezone('America/Chicago')->format('g:i A');
        $shipping_chart_year[] = ['name' => $hour, 'data' => [['x' => $item['label'], 'y' => $item['count']]]];
    }

【问题讨论】:

    标签: php arrays laravel


    【解决方案1】:

    此函数按照您的预期格式化数组。

    function formatArray($array){
        $response = [];
        $keysIndexes = [];
        foreach($array as $value) {
            if(!array_key_exists($value['name'], $keysIndexes)) {
                array_push($response, $value);
                $keysIndexes[$value['name']] = sizeof($keysIndexes);
            } else {
                array_push($response[$keysIndexes[$value['name']]]['data'], $value['data'][0]);
            }
        }
        return $response;
    }
    

    【讨论】:

    • 搞定了,谢谢!
    【解决方案2】:

    如果你想用 Laravel Collections 来实现这一点(你可以用它做很多事情!),那就去吧(基于你当前的数组结构)。

    它更具可读性并且更容易实现。

    $output = collect(json_decode($data, true))
        ->groupBy('name')
        ->transform(function ($items, $name) {
            // Merge nested arrays into one
            $data = $items->map(function ($item) {
                return $item['data'][0];
            })->toArray();
    
            return [
                'name' => $name,
                'data' => $data,
            ];
        })
        ->values() // removes the key 
        ->toJson(); // returns the collection to json
    

    【讨论】:

    • 谢谢你,我也试过了,效果也很好!
    猜你喜欢
    • 1970-01-01
    • 2014-09-17
    • 2015-01-04
    • 1970-01-01
    • 1970-01-01
    • 2016-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多