0

我在合并基于 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”合并,仅此而已。然后对用户进行另一次合并,这样如果另一个索引有不同的用户,他们都只是合并。

4

3 回答 3

0

听起来您想获取每个应用程序的用户列表。我认为您将不得不遍历它们。您可以像这样创建一个由 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 将用第二个数组覆盖第一个数组中的值,我不认为这是您想要的行为。

于 2011-07-26T00:50:00.100 回答
0

@Andrew,您是否尝试array_merge_recursive()改用?

于 2011-07-26T01:04:32.043 回答
0

终于把一切搞定了。

$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;
   }
}

这很草率,但它确实有效,如果我自己这么说的话,它的效果非常好。尚未对其进行基准测试,但我确实针对一个相当重的阵列对其进行了测试,没有真正明显的延迟。每个索引中的数据比我显示的要多得多。总而言之,我很满足。

我希望这会帮助别人。

于 2011-07-26T02:08:26.560 回答