[PHP] zit elke waarde van een array in een andere array?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • dragontje124
  • Registratie: Mei 2009
  • Laatst online: 07-09 17:50
hey,
ik ben in PHP een kaartspel server app aan het maken (vergelijkbaar met de Rummikub programmeer wedstrijd hier op GoT).
Hiervoor wil ik controleren of alle kaarten die iemand speelt ook echt in zijn hand zitten.
Stel dit is het geval:
PHP:
1
2
$gespeeld = array("K","K","K");
$hand = array("Q","K","4","J");

ik heb al geprobeerd in_array() te gebruiken maar deze accepteert alleen enkele waarden en geen lijsten met waarden. Een combinatie van foreach() en in_array() werkt ook niet want dan zou daar true uitkomen in het bovenste geval, want er zit een K in je hand en in_array("K",$hand) geeft telkens true.
Verder heb ik ook het volgende geprobeerd:
PHP:
1
2
3
4
5
$gespeeld = array("K","K","K");
$hand = array("Q","K","4","J");
if(array_intersect($gespeeld,$hand) == $gespeeld)   {
            return true;
}

maar ook dit returned in het bovenstaande geval true om dezelfde reden.

Zouden jullie mij dan een beetje op weg kunnen helpen?

Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Staat prima uitgelegd in de handleiding. Je zou kunnen kijken naar array_diff() of array_intersect() afhankelijk van wat je wil doen.

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • TERW_DAN
  • Registratie: Juni 2001
  • Niet online

TERW_DAN

Met een hamer past alles.

Is het sowieso niet handig om unieke waardes te gaan gebruiken? HK, SK, RK en KK (harten-, schoppen-, ruiten- en klaverkoning) in plaats van enkel K(oning)?

Acties:
  • 0 Henk 'm!

  • mhaket
  • Registratie: Augustus 2006
  • Laatst online: 18:11
Vraag: waar staat "K" voor? Koning neem ik aan maar is de soort (Harten, Schoppen, etc) niet van belang?

edit:
net te laat zie ik :-)

[ Voor 16% gewijzigd door mhaket op 25-06-2010 13:56 ]


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Terw_Dan schreef op vrijdag 25 juni 2010 @ 13:54:
Is het sowieso niet handig om unieke waardes te gaan gebruiken? HK, SK, RK en KK (harten-, schoppen-, ruiten- en klaverkoning) in plaats van enkel K(oning)?
Dat, en anders kaart voor kaart controleren.

Acties:
  • 0 Henk 'm!

  • dragontje124
  • Registratie: Mei 2009
  • Laatst online: 07-09 17:50
Nee ruiten schoppen klaveren etc is in dit geval niet belangrijk, dat heb ik eruit gelaten om het gemakkelijker te maken, want in dit spel (Presidenten/Klootzakken) zijn die niet van belang.

Acties:
  • 0 Henk 'm!

  • Soggney
  • Registratie: Mei 2009
  • Laatst online: 19-09 19:41

Soggney

Zeekomkommer

kopieer het hand naar een tijdelijke array, compare element 1, en haal die dan uit de temp array.
Dan zal de 2de al op false te komen staan

[ Voor 71% gewijzigd door Soggney op 25-06-2010 14:11 . Reden: Meer uitleg is altijd plezanter ]

Statement of Soggney, If you find anything offensive, I will not care. Inventory


Acties:
  • 0 Henk 'm!

  • dragontje124
  • Registratie: Mei 2009
  • Laatst online: 07-09 17:50
Soggney schreef op vrijdag 25 juni 2010 @ 13:59:
bij een match de value eruit laten
hmm, das een goeie inderdaad, daar had ik nog niet aan gedacht :P
stom |:(

Acties:
  • 0 Henk 'm!

  • DLGandalf
  • Registratie: Maart 2005
  • Laatst online: 22-08 17:20
Ik zou jezelf is inlezen op set-theorie, dat is fundamentele kennis voor programmeren. Het is behoorlijk droge kost, maar het leert je wel dingen die op een of andere manier in elke programmeertaal zitten.

http://oreilly.com/catalog/progphp/chapter/ch05.html hier staat het specifiek voor php onder het kopje "Using Arrays" subkopje "sets", als je die operaties snapt, kan je dit soort dingen in elke taal.

Acties:
  • 0 Henk 'm!

  • dragontje124
  • Registratie: Mei 2009
  • Laatst online: 07-09 17:50
DLGandalf schreef op vrijdag 25 juni 2010 @ 14:06:
Ik zou jezelf is inlezen op set-theorie, dat is fundamentele kennis voor programmeren. Het is behoorlijk droge kost, maar het leert je wel dingen die op een of andere manier in elke programmeertaal zitten.

http://oreilly.com/catalog/progphp/chapter/ch05.html hier staat het specifiek voor php onder het kopje "Using Arrays" subkopje "sets", als je die operaties snapt, kan je dit soort dingen in elke taal.
heb het even vlug doorgelezen en heb het idee dat ik de meeste dingen zoniet alle dingen al wist, ik ben ook niet echt een beginner in het programmeren, heb al redelijk wat jaren ervaring met PHP en heb ook al een beetje met C/C++ gewerkt.

Acties:
  • 0 Henk 'm!

  • Toolskyn
  • Registratie: Mei 2004
  • Laatst online: 22-06 11:01

Toolskyn

€ 500,-

DLGandalf schreef op vrijdag 25 juni 2010 @ 14:06:
Ik zou jezelf is inlezen op set-theorie, dat is fundamentele kennis voor programmeren. Het is behoorlijk droge kost, maar het leert je wel dingen die op een of andere manier in elke programmeertaal zitten.

http://oreilly.com/catalog/progphp/chapter/ch05.html hier staat het specifiek voor php onder het kopje "Using Arrays" subkopje "sets", als je die operaties snapt, kan je dit soort dingen in elke taal.
Een set mag alleen unieke items bevatten, aangezien dat hier niet het geval is heb je weinig aan de operaties zoals die gedefinieerd zijn in set-theory, simpelweg omdat je niet te maken hebt met een set. Ik vrees dat je voor dit geval toch echt iets van een extra boolean array moet hebben, of je moet items verwijderen uit de array waarmee je vergelijkt. Of je moet toch de kaarten uniek maken (dus onderscheid maken tussen schoppen, harten etc). Dat de kaarten voor de regels van het spel eenzelfde waarde hebben doet niets af aan dat elke kaart uniek is.

gewooniets.nl


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

(jarig!)
dragontje124 schreef op vrijdag 25 juni 2010 @ 13:57:
Nee ruiten schoppen klaveren etc is in dit geval niet belangrijk, dat heb ik eruit gelaten om het gemakkelijker te maken, want in dit spel (Presidenten/Klootzakken) zijn die niet van belang.
Ik zou het er toch weer in terugstoppen. Dan kan je namelijk triviaal kijken of de array_intersect tussen je hand en de gespeelde kaarten overeenkomt met de gespeelde kaarten. Zoiets zou dan moeten werken:

array_intersect($hand, $gespeeld) == $gespeeld

Acties:
  • 0 Henk 'm!

  • dragontje124
  • Registratie: Mei 2009
  • Laatst online: 07-09 17:50
ACM schreef op zondag 27 juni 2010 @ 10:44:
[...]

Ik zou het er toch weer in terugstoppen. Dan kan je namelijk triviaal kijken of de array_intersect tussen je hand en de gespeelde kaarten overeenkomt met de gespeelde kaarten. Zoiets zou dan moeten werken:

array_intersect($hand, $gespeeld) == $gespeeld
ik heb het nu opgelost door $hand te kopiëren naar een temp variabele en dan telkens als ik een waarde tegenkom deze te verwijderen uit de temp variabele.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

dragontje124 schreef op zondag 27 juni 2010 @ 13:24:
[...]

ik heb het nu opgelost door $hand te kopiëren naar een temp variabele en dan telkens als ik een waarde tegenkom deze te verwijderen uit de temp variabele.
Waarom luister je nu niet naar de gegeven adviezen? Array_intersect/array_diff kan hetzelfde...

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • dragontje124
  • Registratie: Mei 2009
  • Laatst online: 07-09 17:50
NMe schreef op zondag 27 juni 2010 @ 13:57:
[...]

Waarom luister je nu niet naar de gegeven adviezen? Array_intersect/array_diff kan hetzelfde...
ja, dat klopt en ik heb er ook over nagedacht, maar ik heb de kleur van de kaarten er toch uitgehaald, dit omdat er ook mensen aan de wedstrijd meedoen die niet zo goed zijn met PHP, door de kleur weg te laten maak ik het ze wat makkelijker. Ik zou natuurlijk ook net voor het versturen de kleur zelf weg kunnen halen, maar dat vind ik een beetje onnodig.

Acties:
  • 0 Henk 'm!

  • dutchcamel
  • Registratie: November 2004
  • Laatst online: 17:46
dragontje124 schreef op zondag 27 juni 2010 @ 14:02:
[...]

ja, dat klopt en ik heb er ook over nagedacht, maar ik heb de kleur van de kaarten er toch uitgehaald, dit omdat er ook mensen aan de wedstrijd meedoen die niet zo goed zijn met PHP, door de kleur weg te laten maak ik het ze wat makkelijker. Ik zou natuurlijk ook net voor het versturen de kleur zelf weg kunnen halen, maar dat vind ik een beetje onnodig.
Dat is niet wat NMe zegt. Je gaat nu zelf code schrijven om functionaliteit te simuleren die al bestaat. NMe en anderen in dit topic wijzen je op bestaande functies die precies doen wat jij wil. Je reactie over het weglaten van de kleur van een kaart heeft helemaal niets met NMe's opmerking te maken

[ Voor 7% gewijzigd door dutchcamel op 27-06-2010 16:52 . Reden: Kleine toevoeging ]


Acties:
  • 0 Henk 'm!

  • Toolskyn
  • Registratie: Mei 2004
  • Laatst online: 22-06 11:01

Toolskyn

€ 500,-

dutchcamel schreef op zondag 27 juni 2010 @ 16:51:
[...]


Dat is niet wat NMe zegt. Je gaat nu zelf code schrijven om functionaliteit te simuleren die al bestaat. NMe en anderen in dit topic wijzen je op bestaande functies die precies doen wat jij wil. Je reactie over het weglaten van de kleur van een kaart heeft helemaal niets met NMe's opmerking te maken
Wel degelijk, want als je de kleur weglaat heb je geen unieke items en dan werkt array_intersect niet meer zoals je dat in dit geval wil (intersect is een operatie op een set, en een array met niet-unieke items is simpelweg geen set). Je hebt dus wel degelijk unieke items nodig (en dus de kleur van de kaart toevoegen) als je de ingebouwde functionaliteit wil gebruiken.

gewooniets.nl


Acties:
  • 0 Henk 'm!

  • dragontje124
  • Registratie: Mei 2009
  • Laatst online: 07-09 17:50
met hem ^

Acties:
  • 0 Henk 'm!

  • dutchcamel
  • Registratie: November 2004
  • Laatst online: 17:46
Toolskyn schreef op zondag 27 juni 2010 @ 17:08:
[...]
Wel degelijk, want als je de kleur weglaat heb je geen unieke items en dan werkt array_intersect niet meer zoals je dat in dit geval wil (intersect is een operatie op een set, en een array met niet-unieke items is simpelweg geen set). Je hebt dus wel degelijk unieke items nodig (en dus de kleur van de kaart toevoegen) als je de ingebouwde functionaliteit wil gebruiken.
Je hebt gelijk, ik had te snel gereageerd zonder goed te lezen wat het precieze probleem is. Omdat het niet zelden voorkomt dat topicstarters een goed antwoord negeren en een als oplossing met een onnodige omweg aankomen dacht ik daar nu dus ook te snel aan. Dat was hier dus niet het geval, ik moet beter lezen voor ik reageer :)

Acties:
  • 0 Henk 'm!

  • dragontje124
  • Registratie: Mei 2009
  • Laatst online: 07-09 17:50
dutchcamel schreef op zondag 27 juni 2010 @ 18:13:
[...]


Je hebt gelijk, ik had te snel gereageerd zonder goed te lezen wat het precieze probleem is. Omdat het niet zelden voorkomt dat topicstarters een goed antwoord negeren en een als oplossing met een onnodige omweg aankomen dacht ik daar nu dus ook te snel aan. Dat was hier dus niet het geval, ik moet beter lezen voor ik reageer :)
haha, dat zie ik als een compliment :)

Acties:
  • 0 Henk 'm!

  • jvdmeer
  • Registratie: April 2000
  • Laatst online: 19:46
Ik ken het hele spel niet, maar is het niet mogelijk en nuttig om het allemaal om te draaien?

Dus een array met alle kaarten en waar die zich bevinden?

PHP:
1
2
3
4
5
6
$kaarten['H2']=1;   //Harten 2 bij speler 1
$kaarten['H3']=0;   //Harten 3 op de draaistapel
$kaarten['H4']=2;   //Harten 4 bij speler 2
$kaarten['H5']=-1;   //Harten 5 op tafel
$kaarten['H6']=1;   //Harten 6 bij speler 1
// enzovoorts... voor het hele spel.


Op die manier voorkom je dat een kaart per ongeluk in 2 arrays (op 2 plaatsen) tegelijk is. Maakt de administratie misschien makkelijker.

Acties:
  • 0 Henk 'm!

  • dragontje124
  • Registratie: Mei 2009
  • Laatst online: 07-09 17:50
jvdmeer schreef op zondag 27 juni 2010 @ 23:23:
Ik ken het hele spel niet, maar is het niet mogelijk en nuttig om het allemaal om te draaien?

Dus een array met alle kaarten en waar die zich bevinden?

PHP:
1
2
3
4
5
6
$kaarten['H2']=1;   //Harten 2 bij speler 1
$kaarten['H3']=0;   //Harten 3 op de draaistapel
$kaarten['H4']=2;   //Harten 4 bij speler 2
$kaarten['H5']=-1;   //Harten 5 op tafel
$kaarten['H6']=1;   //Harten 6 bij speler 1
// enzovoorts... voor het hele spel.


Op die manier voorkom je dat een kaart per ongeluk in 2 arrays (op 2 plaatsen) tegelijk is. Maakt de administratie misschien makkelijker.
ik heb voor elke speler een object player die elk een property "hand" hebben dus dat is al geregeld ;)

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

(jarig!)
dragontje124 schreef op zondag 27 juni 2010 @ 23:34:
ik heb voor elke speler een object player die elk een property "hand" hebben dus dat is al geregeld ;)
Daar heb je niet per se mee uitgesloten dat een bepaalde kaart niet in meerdere handen tegelijk kan zitten hoor ;) je hebt dat vast wel geregeld, maar niet simpelweg doordat je het netjes met objecten hebt gemodelleerd.

Acties:
  • 0 Henk 'm!

  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

DLGandalf schreef op vrijdag 25 juni 2010 @ 14:06:
Ik zou jezelf is inlezen op set-theorie, dat is fundamentele kennis voor programmeren. Het is behoorlijk droge kost, maar het leert je wel dingen die op een of andere manier in elke programmeertaal zitten.

http://oreilly.com/catalog/progphp/chapter/ch05.html hier staat het specifiek voor php onder het kopje "Using Arrays" subkopje "sets", als je die operaties snapt, kan je dit soort dingen in elke taal.
Alleen is het nogal hoogdravend om dat 'set-theorie' te noemen. Een wiskundige zal je smalend aankijken als je zegt kennis van 'set-theorie' te hebben omdat je weet wat unions en intersections zijn.
ACM schreef op maandag 28 juni 2010 @ 08:03:
Daar heb je niet per se mee uitgesloten dat een bepaalde kaart niet in meerdere handen tegelijk kan zitten hoor ;) je hebt dat vast wel geregeld, maar niet simpelweg doordat je het netjes met objecten hebt gemodelleerd.
Nu zijn er spellen die ook met meerdere pakken kaarten gespeeld kunnen worden, dus misschien wil je sowieso niet expliciet uitsluiten dat dezelfde kaart in meerdere handen kan zitten. Wat je wilt is een Deck, die aan het begin alle kaarten bevat die in het spel kunnen komen en waar een voor een kaarten aan gevraagd kunnen worden. Als je die met 52 verschillende kaarten initialiseert, is iedere uitgedeelde kaart gegarandeerd uniek, maar kan je ook gemakkelijk op twee spellen overstappen.

Wie trösten wir uns, die Mörder aller Mörder?


Acties:
  • 0 Henk 'm!

  • dragontje124
  • Registratie: Mei 2009
  • Laatst online: 07-09 17:50
ACM schreef op maandag 28 juni 2010 @ 08:03:
[...]

Daar heb je niet per se mee uitgesloten dat een bepaalde kaart niet in meerdere handen tegelijk kan zitten hoor ;) je hebt dat vast wel geregeld, maar niet simpelweg doordat je het netjes met objecten hebt gemodelleerd.
ah ja klopt, ik had zn reactie niet helemaal goed gelezen..

Acties:
  • 0 Henk 'm!

  • eghie
  • Registratie: Februari 2002
  • Niet online

eghie

Spoken words!

Gewoon een functie maken die de hand in een tijdelijke variable gooit en daar telkens 1 uit weg haalt en dan weer array_search() gebruiken.

Dus iets als:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function geldige_kaarten($hand, $gespeeld) {
    $tmphand = $hand;
    
    foreach ($gespeeld as $kaart) {
        $i = array_search($kaart, $tmphand);
        
        if ($i !== FALSE && isset($tmphand[$i])) {
            unset($tmphand[$i]);
        } else {
            return FALSE;
        }
    }
    
    return TRUE;
}


Als je de ongeldige kaarten als return waarde wil hebben kun je ipv return FALSE de zooi in een array stoppen en die returnen.

[ Voor 14% gewijzigd door eghie op 29-06-2010 23:13 ]

Pagina: 1