TransWikia.com

Слияние двух массивов по одинаковому значению

Stack Overflow на русском Asked by spl33t on February 15, 2021

Есть два масcива которые нужно объединить по одинаковому значению ключа, [SteamID64] в первой таблице и [steamid] во второй таблице.
В первом массиве [SteamID64] может быть одинаковый в примере я как раз описал этот случай.

Первый массив

$arr1 = [
    '0' => [
        "PlayerID" => "1",
        "User" => "lexa",
        "Time" => "300",
        "SteamID64" => "76561198170801830",
        "SteamID" => "STEAM_0:0:105268051"
    ],
    '1' => [
        "PlayerID" => "1",
        "User" => "lexa",
        "Time" => "250",
        "SteamID64" => "76561198170801830",
        "SteamID" => "STEAM_0:0:105268051"
    ],
    '2'=> [
        'PlayerID' => "5",
        'User' => "Player",
        "Time" => "400",
        'SteamID64' => "76561199604582870",
        'SteamI' => "STEAM_0:0:822158571"
    ],
    '3' => [
        "PlayerID" => "4",
        "User" => "idfyau",
        "Time" => "360",
        "SteamID64" => "76561198161729178",
        "SteamID" => "STEAM_0:0:100731725"
    ]
];

Второй массив

$arr2 = [
    '76561198170801830'=> [
      "steamid" => "76561198170801830",
      "personaname" => "Black_Mens___",
      "profileurl" => "https://steamcommunity.com/id/3523557555/",
      "avatar" => "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars/64/64d96db5c4a160205149bbfab2ccdbc7c3bad688.jpg"
    ],
    '76561198161729178'=> [
        "steamid"=> "76561198161729178",
        "personaname"=> "ак4ОнаиД",
        "profileurl"=> "https://steamcommunity.com/id/dfhfdj/",
        "avatar"=> "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars/bf/bfa372987ba46f33b75ea1078e5b0a0a001cb2d8.jpg"
    ]     
];

Желаемый результат* для игрока с [PlayerID] => 5 не было найдено пары поэтому он попадает в результат каким и был.

$data = [
    '0' => [
        "PlayerID" => "1",
        "User" => "lexa",
        "Time" => "300",
        "SteamID64" => "76561198170801830",
        "SteamID" => "STEAM_0:0:105268051",
        "personaname" => "Black_Mens___",
        "profileurl" => "https://steamcommunity.com/id/3523557555/",
        "avatar" => "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars/64/64d96db5c4a160205149bbfab2ccdbc7c3bad688.jpg"   
    ],
    '1' => [
        "PlayerID" => "1",
        "User" => "lexa",
        "Time" => "250",
        "SteamID64" => "76561198170801830",
        "SteamID" => "STEAM_0:0:105268051",
        "personaname" => "Black_Mens___",
        "profileurl" => "https://steamcommunity.com/id/3523557555/",
        "avatar" => "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars/64/64d96db5c4a160205149bbfab2ccdbc7c3bad688.jpg"   
    ],
    '2'=> [
        'PlayerID' => "5",
        'User' => "Player",
        "Time" => "400",
        'SteamID64' => "76561199604582870",
        'SteamI' => "STEAM_0:0:822158571"
    ],
    '3' => [
        "PlayerID" => "4",
        "User" => "idfyau",
        "Time" => "360",
        "SteamID64" => "76561198161729178",
        "SteamID" => "STEAM_0:0:100731725",
        "personaname" => "ак4ОнаиД",
        "profileurl" => "https://steamcommunity.com/id/dfhfdj/",
        "avatar" => "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars/bf/bfa372987ba46f33b75ea1078e5b0a0a001cb2d8.jpg"
    ]
];

Сейчас я делаю это так:

    foreach ($arr1 as $key => $row1) {
        foreach ($arr2 as $key => $row2) {
            if($row1['SteamID64'] == $row2['steamid'] ){
                $row1['SteamID64'] = $row2['steamid'];
                $row1['personaname'] = $row2['personaname'];
                $row1['profileurl'] = $row2['profileurl'];
                $row1['avatar'] = $row2['avatar'];
                $row1['avatarmedium'] = $row2['avatarmedium'];
                $row1['avatarfull'] = $row2['avatarfull'];
                $data[] = $row1;
                break;
            }
        }
    }

И получаю это Для игрока с [PlayerID] => 5 не было найдено пары и его нету в результате

$data = [
    '0' => [
        "PlayerID" => "1",
        "User" => "lexa",
        "Time" => "300",
        "SteamID64" => "76561198170801830",
        "SteamID" => "STEAM_0:0:105268051"
        "personaname" => "Black_Mens___"
        "profileurl" => "https://steamcommunity.com/id/3523557555/"
        "avatar" => "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars/64/64d96db5c4a160205149bbfab2ccdbc7c3bad688.jpg"   
    ],
    '1' => [
        "PlayerID" => "1",
        "User" => "lexa",
        "Time" => "250",
        "SteamID64" => "76561198170801830",
        "SteamID" => "STEAM_0:0:105268051"
        "personaname" => "Black_Mens___"
        "profileurl" => "https://steamcommunity.com/id/3523557555/"
        "avatar" => "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars/64/64d96db5c4a160205149bbfab2ccdbc7c3bad688.jpg"   
    ],
    '2' => [
        "PlayerID" => "4",
        "User" => "idfyau",
        "Time" => "360",
        "SteamID64" => "76561198161729178",
        "SteamID" => "STEAM_0:0:100731725"
        "personaname" => "ак4ОнаиД"
        "profileurl" => "https://steamcommunity.com/id/dfhfdj/"
        "avatar" => "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars/bf/bfa372987ba46f33b75ea1078e5b0a0a001cb2d8.jpg"
    ]
];

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

2 Answers

А если попробовать вот так?

foreach ($arr1 as $key => $row1) {
    $temp = $row1;
    if (array_key_exists($row1['SteamID64'], $arr2)) {
        $temp += $arr2[$row1['SteamID64']];
    }
    $data[] = $temp;

}

Correct answer by ArchDemon on February 15, 2021

`

$arr1 = [
    '0' => [
        "PlayerID" => "1",
        "User" => "lexa",
        "SteamID64" => "76561198170801830",
        "SteamID" => "STEAM_0:0:105268051"
    ],
    '1' => [
        "PlayerID" => "4",
        "User"  => "idfyau",
        "SteamID64" => "76561198161729178",
        "SteamID" => "STEAM_0:0:100731725"
    ],
    '2'=> [
        'PlayerID' => "5",
        'User' => "Player",
        'SteamID64' => "76561199604582870",
        'SteamI' => "STEAM_0:0:822158571"
    ]
];


$arr2 = [
    '76561198170801830'=> [
      "steamid" => "76561198170801830",
      "personaname" => "Black_Mens___",
      "profileurl" => "https://steamcommunity.com/id/3523557555/",
      "avatar" => "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars/64/64d96db5c4a160205149bbfab2ccdbc7c3bad688.jpg"
    ],
    '76561198161729178'=> [
        "steamid"=> "76561198161729178",
        "personaname"=> "ак4ОнаиД",
        "profileurl"=> "https://steamcommunity.com/id/dfhfdj/",
        "avatar"=> "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars/bf/bfa372987ba46f33b75ea1078e5b0a0a001cb2d8.jpg"
    ]
      
];

$arr3 = [];

foreach ($arr1 as $key1 => $row1) {
    foreach($arr2 as $key2 => $row2) {
        
        if($row1['SteamID64'] == $key2) {
            $arr3[$key2] = array_merge($row1, $row2);
        }

    }
}


echo '<pre>';
print_r($arr3);
echo '</pre>';`

Answered by Эльдар Дадашов on February 15, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP