Multi array_merge - PullRequest
       16

Multi array_merge

0 голосов
/ 26 июля 2011

У меня возникли некоторые трудности при объединении многомерного массива на основе 1 индекса.Я не знаю, только что я слишком долго ломал себе голову и все испортил или что-то еще, но я не могу этого понять.

Пример 2 индексов из 2 массивов таков:

// Array1:
[0] => Array
    (
        [appID] => 58510
        [name] => SomeRandomApp
        [users] => Array
            (
                [0] => randomUser
            )

    )

// Array2:
[0] => Array
    (
        [appID] => 58510
        [name] => SomeRandomApp
        [users] => Array
            (
                [0] => anotherUser
            )

    )

// Desired Result:
[0] => Array
    (
        [appID] => 58510
        [name] => SomeRandomApp
        [users] => Array
            (
                [0] => randomUser
                [1] => anotherUser
            )

    )

Я хотел бы объединить на основе "appID" и ничего больше.Затем выполните другое объединение пользователей, чтобы, если в другом индексе были разные пользователи, все они просто объединялись.

Ответы [ 3 ]

0 голосов
/ 26 июля 2011

@ Эндрю, вы пытаетесь использовать array_merge_recursive() вместо?

0 голосов
/ 26 июля 2011

Наконец-то все получилось.

$newArray = array();
foreach($data as $item)
{
   $appID = $item['appID'];
   $users = $item['users'];

   unset($item['users']);
   unset($item['hoursOnRecord']);

   if(!isset($newArray[$appID]))
   {
      $newArray[$appID] = $item;
      foreach($users as $user)
         $newArray[$appID]['users'][] = $user;                  
   }
   else
   {
      $users2 = $newArray[$appID]['users'];
      $newArray[$appID] = $item;

      foreach($users as $user)
         $newArray[$appID]['users'][] = $user;
      foreach($users2 as $user)
         $newArray[$appID]['users'][] = $user;
   }
}

Это довольно небрежно, но работает, и работает чертовски хорошо, если я сам так скажу.Пока еще не тестировали, но я протестировал его на довольно тяжелом массиве без заметной задержки.В каждом индексе намного больше данных, чем я показываю.В общем, я доволен.

Надеюсь, это поможет кому-то еще.

0 голосов
/ 26 июля 2011

Похоже, вы хотите получить список пользователей для каждого приложения.Я думаю, что вам придется пройти через них.Вы можете создать результирующий массив с индексом appID следующим образом (не тестировано):

function app_users($array1, $array2) {
  $combined = array ();
  foreach (array($array1, $array2) as $arr) {
    foreach ($arr as $values) {
      if (!isset($combined[$values['appId']])) {
        $combined[$values['appID']] = $values;
      }
      else {
        $combined[$values['appID']]['users'][] = $values['users'][0];
      }
    }
  }      
}

$result = app_users($array1, $array2);

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

В качестве примечания, array_merge будет перезаписывать значения в первом массиве вторым в случае дублированных ключей, что, я не думаю, является поведениемхочу здесь.

...