[PHP] meerdere waarden matchen op objecten

Pagina: 1
Acties:

Onderwerpen


  • ID-College
  • Registratie: November 2003
  • Laatst online: 17:16
Ik kom er echt niet uit en ik hoop dat jullie mij hulp kunnen bieden. Dit probleem is vrij complex (vind ik dan :{) en ik krijg het maar niet voor elkaar; daarom vraag ik jullie hulp nog maar een keer.

Ik heb een array met objecten. Wat ik wil is kijken of een object in de array bepaalde waarden heeft.
Hiervoor heb ik een functie _exist() maken met 2 parameters. (1) het type object, (2) de condities in een array.
Ik wil de functie zo gebruiken:
PHP:
1
2
3
4
5
if($this->_exist("user", array("getName" => "Henk", "getStatus" => 1, "getEmail" => "test@test.nl"))) {
//bestaat
} else {
//bestaat niet!
}

De array die ik wil gebruiken is dynamisch. Als eerst geef ik het type object mee en daarna een array met waarden. Soms bevat de array 1 key, soms zijn er 3 keys. De key van de array is de functienaam van de class, de value van de array is de waarde die moet kloppen.

Nu dacht ik:
PHP:
1
2
3
4
5
6
7
8
9
10
11
private function _exist($instanceType, $values = array()) {
    foreach($this->objects as $object) {
        if($object instanceof $instanceType) {
            foreach($values as $key => $value) {
                if($object->$key() === $value) {
                    $remainingObjects[] = $object;
                }
            }
        }
    }
}

Dit klopt echter niet, want ik krijg meerdere objecten. Logisch, want er wordt per stuk gekeken (eigenlijk een OR conditie door de loop) of iets overeen komt, en ik wil alles matchen (AND dus). Is dit mogelijk? Keer op keer kom ik op een foreach in een foreach uit, maar dit zorgt dus juist voor de problemen. Kan iemand een tipje geven hoe dit gerealiseerd kan worden? Het lukt me echt niet en ik heb al de meest achterlijke dingen geschreven, maar dat is zo brak dat het ik het liever niet wil. Wat is hier de sleutelfunctie/sleutelwoord?

Ik zat te denken om op de remainingObjects verder te foreachen, maar deze begint natuurlijk weer doodleuk vooraan in de array. Moet ik de array pointer opschuiven b.v. met array_shift en dan een nieuwe loop creëren? Ik kom er echt niet meer uit :/

[ Voor 6% gewijzigd door ID-College op 29-02-2012 23:12 ]


  • borft
  • Registratie: Januari 2002
  • Laatst online: 03-11 18:13
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php 
private function _exist($instanceType, $values = array()) { 
    foreach($this->objects as $object) { 
        if($object instanceof $instanceType) { 
            foreach($values as $key => $value) { 
                if($object->$key() !== $value) { 
                    return false;
                } 
            } 
        } 
    } 
   return true;
} 
?>


zoiets? ;)


btw, array_shift() verschuift de array pointer niet, het sloopt er een element af. met next() kan je de array pointer opschuiven.

[ Voor 14% gewijzigd door borft op 29-02-2012 23:20 ]


  • DataGhost
  • Registratie: Augustus 2003
  • Laatst online: 16:46

DataGhost

iPL dev

Ik hoop dat ik je hiermee een beetje op weg help: Wikipedia: De Morgan's laws
We moeten natuurlijk niet alles voorkauwen he :+

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 13:54

.oisyn

Moderator Devschuur®

Demotivational Speaker

Wat je moet doen is goed in woorden uitdenken wat je nu wilt bereiken. Nu voeg je elke object aan de array toe zodra er ook maar 1 conditie klopt. Je wilt 'm pas toevoegen als álle condities kloppen. Dit kun je dus ook pas weten ná de loop, en niet tijdens de loop zelf.
Mja, beetje jammer. Wat leert de TS hier nou van?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • borft
  • Registratie: Januari 2002
  • Laatst online: 03-11 18:13
dat ie zijn logica moet omdraaien ;) Maar ik zal in het vervolg de oplossing niet meer voorkauwen hoor, wat dat betreft heb je helemaal gelijk.

Besides, het is alsnog maar een deel van de oplossing.

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Een beetje een spoiler, maar wat dacht je er van om gewoon "==" te gebruiken om te vergelijken of het om eenzelfde array/object gaat?
http://php.net/manual/en/language.oop5.object-comparison.php
http://php.net/manual/en/language.operators.array.php

En misschien ben je in_array aan het herimplementeren. :p



Als het een oefening in php is, of als het om onvolledige condities gaat, is het waarschijnlijk handig om het probleem op te splitsen in deelproblemen die je wel kan oplossen. Je kunt hier bijvoorbeeld het testje op gelijkheid afsplitsen van de hoofdfunctie met het loopje. Dus een aparte functie matches($object, $requirements) invoeren die true geeft bij een match en false anders.
borft schreef op woensdag 29 februari 2012 @ 23:24:
Besides, het is alsnog maar een deel van de oplossing.
Ik zie daar geen oplossing. Bijv. Lege array=> object bestaat. Soortgelijk object, object in array=> object bestaat niet.

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • ID-College
  • Registratie: November 2003
  • Laatst online: 17:16
Bedankt! Daar ga ik morgen naar kijken.

De functie werkt echter niet helemaal, want ik krijg wel 1 object terug, maar niet de juiste! Ik moet nu maffen, maar morgen ga ik er verder op door :) Bedankt voor de info tot nu toe :)

  • borft
  • Registratie: Januari 2002
  • Laatst online: 03-11 18:13
houd er rekening mee dat == iets heel anders doet dan instanceof. De eerste kijkt naar de naam van de instantie en de waardes van zijn attributen. De tweede kijkt naar de naam van de instantie, maar ook naar de klasse hierarchie, en dus niet naar waardes van attributen in de instantie. Verder kun je dus met instanceof ook matchen op de parent class.


Ik had je lijstje met objecten gemist, dus mijn voorstel geeft er idd maar een terug. Dat kan je bv oplossen door helemaal aan het begin van je functie een lege array te definieren, en ipv een return true dat object aan de array toe te voegen. Bij de return false wil je dan uit de loop breaken.

En helemaal aan het eind je supergave nieuwe array returnen natuurlijk.
Pagina: 1