Verwijder dubbels uit array

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Louis Deconinck

Louis Deconinck

05/10/2021 15:18:23
Quote Anchor link
Ik ben een tool aan het maken, die de kaartencollectie van een speler weergeeft. Hiervoor haal ik data op via een JSON API en op basis daarvan genereer ik alle kaarten. Dit werkt heel goed. Het probleem is echter dat spelers meerdere malen dezelfde kaart kunnen hebben. In zo'n geval wil ik niet alle kaarten tonen, maar die kaart slechts een keer, namelijk die met het hoogste level.

Ik heb volgende JSON:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
{
  "player": "yingyu",
  "cards": [
    {
      "player": "yingyu",
      "uid": "C3-248-9G9SA73GZK",
      "card_detail_id": 248,
      "xp": 1,
      "gold": false,
      "edition": 3,
      "level": 1
    },
    {
      "player": "yingyu",
      "uid": "C3-283-MNVC8ET79S",
      "card_detail_id": 283,
      "xp": 1,
      "gold": false,
      "edition": 3,
      "level": 1
    },
    {
      "player": "yingyu",
      "uid": "C3-283-2SIKI2BX9S",
      "card_detail_id": 283,
      "xp": 4,
      "gold": false,
      "edition": 3,
      "level": 2
    }
  ]
}


Dit is de JSON data voor 3 kaarten. Echter, kaart 2 en 3 zijn eignelijk dezelfde kaart (card_detail_id is voor beide kaarten hetzelfde). Met kaart 2 wil ik dus eigenlijk niets doen.

Momenteel gebruik ik een foreach loop om door elke kaart te gaan en op basis van de waardes in de JSON genereer ik de artwork automatisch. Ik wil dat wanneer meerdere kaarten dezelfde card_detail_id hebben, enkel de kaart getoond wordt die het hoogste level heeft. Hoe zou ik zoiets aanpakken?

Dit is de PHP code die ik momenteel heb:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?php
   $contents2
= file_get_contents("https://api.splinterlands.io/cards/get_details");
   $array2 = json_decode($contents2, true);

   $contents3 = file_get_contents('https://api2.splinterlands.com/cards/collection/yingyu');
   $array3 = json_decode($contents3, true);

foreach ($array3['cards'] as $card) {
    $colcardid = $card['card_detail_id'];
    $colcardid--;
    $colcardname = $array2[$colcardid]['name'];
    $colcardlvl = $card['level'];
    $colcardeditionnr = $card['edition'];
    if ($colcardeditionnr == "0,1") {
     $colcardeditionname = "beta";
    }
elseif ($colcardeditionnr == "1") {
     $colcardeditionname = "beta";
    }
elseif ($colcardeditionnr == "2") {
     $colcardeditionname = "promo";
    }
elseif ($colcardeditionnr == "3") {
     $colcardeditionname = "reward";
    }
elseif ($colcardeditionnr == "4") {
     $colcardeditionname = "untamed";
    }
elseif ($$colcardeditionnr == "5") {
     $colcardeditionname = "dice";
    }

    $colcardgold = $card['gold'];
    if ($colcardgold == true) {
     $colcardgoldstring = "_gold";
    }
else {
     $colcardgoldstring = "";
    }

    echo '<img class="card" src="https://d36mxiodymuqjm.cloudfront.net/cards_by_level/' . $colcardeditionname . '/' . $colcardname . '_lv' .  $colcardlvl . $colcardgoldstring . '.png" height="100" alt="' . $colcardname . '" />';
   }

?>
 
PHP hulp

PHP hulp

06/12/2021 16:36:00
 
Rob Doemaarwat

Rob Doemaarwat

05/10/2021 16:49:28
Quote Anchor link
Het kan op 100 verschillende manier, maar ik zou het zo doen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php

$cards
= $array['cards'];

$ids = array_unique(array_column($cards,'card_detail_id')); //unieke card_detail_id's
foreach($ids as $id){ //voor ieder uniek ID de hoogste kaart bepalen
  //het hoogste level bepalen

  $level = max(array_column($selection = array_filter($cards,function($card) use ($id){
    return $card['card_detail_id'] == $id;
  }),
'level'));
  //de (eerste) kaart met dit level tonen
  foreach($selection as $card) if($card['level'] == $level){
    print_r($card); //toon kaart
    break;
  }
}


?>
 
Ivo P

Ivo P

06/10/2021 17:26:12
Quote Anchor link
ik weet natuurlijk niet waar je de data vandaan trekt, maar het handigste is het, als je de data om te beginnen al niet ophaalt uit de bron.

Dus als die api's in jouw beheer zijn, zou ik daar al de dubbelen tegen proberen te houden. (en dan ook vast nadenken of je altijd de 1e wilt houden, of dat daar soms uitzonderingen op zijn.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.