PHP объединить несколько массивов, сравнивая 3 ключа и значения - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть 5 многомерных массивов, которые я хочу объединить. Все разные массивы имеют разную длину, и каждый из элементов массивов имеет 4 ключа и значения, 3 из которых распределяются между массивами. Эти 3 можно сравнить, и в случае, если эти 3 значения совпадают, тогда массивы можно объединить вместе.

В качестве примера 3 моих массивов выглядят так:

array ( 0 => array("AccountID" => 9407, "year" => 2019,"month" => "November","received" => 36), 1 => array("AccountID" => 1975,"year" => 2019,"month" => "November","received" => 230),)
array ( 0 => array("AccountID" => 9407,"year" => 2019,"month" => "November","analyzed" => 138), 1 => array("AccountID" => 1975,"year" => 2019,"month" => "April","analyzed" => 1),)
array ( 0 => array("AccountID" => 9407,"year" => 2019,"month" => "November","failed" => 1), 1 => array("AccountID" => 1975,"year" => 2020,"month" => "April","failed" => 7),)

То, что я ищу, - это что-то вроде

^ array:11 [▼
  0 => array:4 [▼
    "AccountID" => 9407
    "year" => 2019
    "month" => "November"
    "received" => 36
    "analyzed" => 138
    "failed" => 1
  ]
  1 => array:4 [▼
    "AccountID" => 1975
    "year" => 2020
    "month" => "April"
    "received" => 230
    "analyzed" => 1
    "failed" => 7      ]

, до сих пор я пробовал следующий код, который я использую для объединения двух массивов. это я повторяю для других массивов, объединяя 2 сразу. Но это поставляет неправильные ценности. Возможно, потому что он сравнивается только в том случае, если ключ существует, а не в значении.

       foreach ($received_list as $key => $received) {
        if (array_key_exists($key, $analyzed_list)) {
            $merged[$key] = array_merge($received_list[$key], $analyzed_list[$key]);
        } else {
            $merged[$key] = array_merge($received_list[$key], ['analyzed' => 0]);
        }
       }
      foreach ($analyzed_list as $key => $received) {
        if (array_key_exists($key, $received_list)) {
            $merged[$key] = array_merge($analyzed_list[$key], $received_list[$key]);
        } else {
            $merged[$key] = array_merge($analyzed_list[$key], ['received' => 0]);
        }
      }

Любая помощь очень ценится!

1 Ответ

1 голос
/ 24 апреля 2020

Не самый эффективный, но, похоже, работает

Пример;

    $first = [
        ['AccountID' => 9407, 'year' => 2019, 'month' => 'November', 'received' => 36],
        ['AccountID' => 1975, 'year' => 2019, 'month' => 'November', 'received' => 230],
    ];
    $second = [
        ['AccountID' => 9407, 'year' => 2019, 'month' => 'November', 'analyzed' => 138],
        ['AccountID' => 1975, 'year' => 2019, 'month' => 'April', 'analyzed' => 1],
    ];
    $third = [
        ['AccountID' => 9407, 'year' => 2019, 'month' => 'November', 'failed' => 1],
        ['AccountID' => 1975, 'year' => 2020, 'month' => 'April', 'failed' => 7],
    ];

Код;

    return collect([$first, $second, $third])
        ->flatten(1)
        ->transform(function ($group) {
            $group['id'] = $group['AccountID'] . '-' . $group['year'] . '-' . $group['month'];

            return $group;
        })
        ->groupBy('id')
        ->transform(function (Collection $subGroup) {
            $merge = [];

            $subGroup->transform(function ($sub) use (&$merge) {
                unset($sub['id']);
                $merge = array_merge($sub, $merge);

                return $merge;
            });

            return $subGroup->last();
        })
        ->values()
        ->toArray();

json ответ;

[{"AccountID":9407,"year":2019,"month":"November","failed":1,"analyzed":138,"received":36},{"AccountID":1975,"year":2019,"month":"November","received":230},{"AccountID":1975,"year":2019,"month":"April","analyzed":1},{"AccountID":1975,"year":2020,"month":"April","failed":7}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...