Эффективное объединение нескольких ассоциативных массивов на ключе ID - PullRequest
1 голос
/ 03 февраля 2012

У меня есть несколько массивов php, которые выглядят так (пожалуйста, не спрашивайте почему, я просто делаю свою работу ... Все, что я скажу, это EAV ...):

$firstNames = ([accountId] => 100, [firstName] => 'John'
               [accountId] => 101, [firstName] => 'Fred');


$lastNames =  ([accountId] => 100, [lastName] => 'Doe'
               [accountId] => 101, [lastName] => 'Bloggs');


$city      =  ([accountId] => 100, [city] => 'New York'
               [accountId] => 101, [city] => 'Cambridge');


$country   =  ([accountId] => 100, [country] => 'USA'
               [accountId] => 101, [country] => 'UK');

и т. Д.

Я должен объединить их в один массив:

$userDetails =  ([accountId] => 100, [firstName] => "John", [lastName] => "Doe", 
                 [city] => "New York", [country] => "USA");

Мне кажется, правильный ответ - вырвать эти атрибуты из EAV и смоделировать их правильно.Но я не могу.Также было бы возможно сделать самосоединение при самосоединении в БД, но я упростил пример, и это на самом деле не возможно - и мне сказали сделать это таким образом ... Может быть кучао дополнительных полях, добавленных позже.

Так каков наилучший способ создания одного ассоциативного массива, объединяющего accountId в PHP?Есть ли функция, или мне нужно зацикливаться и т. Д.

1 Ответ

2 голосов
/ 03 февраля 2012

Это вложенное foreach должно сделать это:

$result = array();

foreach (array('firstNames' => 'firstName', 'lastNames' => 'lastName', 'city' => 'city', 'country' => 'country') as $srcArr => $arrKey) {
  foreach ($$srcArr as $item) {
    if (!isset($result[$item['accountId']])) {
      $result[$item['accountId']] = $item;
    } else {
      $result[$item['accountId']][$arrKey] = $item[$arrKey];
    }
  }
}

var_dump($result);

Посмотри, как работает

...