两个数组如何使每个内部对象键匹配以使其交叉?

问题描述 投票:-3回答:3

我有两个数组用户和游戏

$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"
                  }
              ],
          }
      ],   

有人帮助我

php laravel-5.8
3个回答
0
投票

我了解,我不应该对此“非问题”提供答案。我仍然这样做,因为我认为它可能具有一定的学习价值。

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

//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);

0
投票
$users = [
    [
        "name" => "jone",
        "id" => "100"
    ],
    [
        "name" => "Peters",
        "id" => "200"
    ]
];

$games = [
    [
        "name" => "tennis",
        "level" => "05",
        "user_id" => "100"
    ],
    [
        "name" => "football",
        "level" => "03",
        "user_id" => "100"
    ],
    [
        "name" => "football",
        "level" => "05",
        "user_id" => "200"
    ]
];
foreach ($users as $ukey => $user) {
    foreach ($games as $game) {
        if ($game["user_id"] === $user["id"]) {
            $users[$ukey]["game"][] = $game;
        }
    }
}

echo "<pre>";
print_r($users);
die;

-2
投票

尝试一下。它应该工作。

foreach($user as $k => $val){
    foreach($game as $gk => $gval){
        if($val['id'] == $gval['user_id']){
            $user[$k]['game'][] = $gval;
        }
    }
}

echo json_encode($user);

OUTPUT

[ 
   { 
      "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"
         }
      ]
   }
]
© www.soinside.com 2019 - 2024. All rights reserved.