首页 > 解决方案 > 两个数组如何将每个内部对象键匹配交叉?

问题描述

我有两个数组用户和游戏

$user =[
       {
           "name": "jone",
           "id": "100"
       },
       {
           "name": "Peters",
           "id": "200"
       }
   ]

$game = [
       {
           "name": "tennis",
           "level": "05",
           "user_id": "100"
       },
       {
           "name": "football",
           "level": "03",
           "user_id": "100"
       },
       {
           "name": "football",
           "level": "05",
           "user_id": "200"
       }
   ]

我想使用 PHP / Laravel 得到这样的结果

$user = [
          {
              "name": "jone",
              "id": "100"
              "game": [
                  {
                      "name": "tennis",
                      "level": "05",
                      "user_id": "100"
                  },
                  {
                      "name": "football",
                      "level": "03",
                      "user_id": "100"
                  }
              ],
          },
          {
              "name": "Peters",
              "id": "200"
              "game": [
                  {
                      "name": "football",
                      "level": "05",
                      "user_id": "200"
                  }
              ],
          }
      ],   

任何人帮助我

标签: phplaravel-5.8

解决方案


我明白我不应该回答这个“非问题”。我仍然这样做,因为我认为它可能具有一些学习价值。

这个想法是,不要为每个用户循环每个游戏(就像天真的方法那样),因为这根本无法扩展。最好使用匹配数组,然后将游戏排序到其中:

//Prepare matching array
$user_games=array();
foreach ($user as $u) {
        $u['game']=array();
        $user_games[$u['id']]=$u;
}

//Sort games into matching array
foreach ($game as $g) {
        $user_games[$g['user_id']]['game'][]=$g;
}

这样一个新游戏就不会创建 n 个循环(n 是用户数),而只会创建一个。

print_r($user_games);

创建所需的输出。如果作为索引的用户 ID 有问题,只需使用

print_r(array_values($user_games);

推荐阅读