IF-statement voor array

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Marcus geleyn

marcus geleyn

16/08/2015 10:47:11
Quote Anchor link
Een vraagje: onderstaande code toont een stuk array en geeft alle elementen uit die array weer. Dat werkt prima.
Maar nu wil ik dat niet alle elementen uit die array getoond worden, maar dat ik een IF-statement kan gebruiken. Voorbeeld: als $row["therapie"] het cijfer 2 bevat, dan...
$row["therapie"] kan 1 tot 120 verschillende elementen bevatten, gescheiden door "," en ik hoef maar op één getal te controleren om dan iets te doen.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
echo "<br> Therapie: ". $row["therapie"]. "<br>";
?>


Kan iemand mij een tip geven?
 
PHP hulp

PHP hulp

24/11/2024 18:16:27
 
- SanThe -

- SanThe -

16/08/2015 11:16:43
Quote Anchor link
Marcus geleyn op 16/08/2015 10:47:11:
$row["therapie"] kan 1 tot 120 verschillende elementen bevatten, gescheiden door ","


Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
$hlp
= explode(',', $row["therapie"]);
if(in_array(2, $hlp))
{

   // doe iets
}
?>
 
Thomas van den Heuvel

Thomas van den Heuvel

16/08/2015 15:33:55
Quote Anchor link
Nog beter is mogelijk, dat als je een element in een array niet wilt tonen als je hier doorheen loopt, deze in eerste instantie niet in het array te stoppen. Je kunt beter vantevoren filteren dan achteraf.

Daarbij voorkom je tevens dat je code bezaaid raakt met dit soort magische nummers.

EDIT: Zelfs als je (nu) maar één nummer hebt die apart behandeld moet worden ("mag niet getoond worden"). Wie zegt dat er straks niet meerdere zijn? In het kader van flexibiliteit/uitbreidbaarheid is het misschien het overwegen waard om een eigenschap "tonen" toe te voegen aan de entiteit "therapie". Je hebt dan ook meteen een criterium om te filteren, zodat je daarna je array makkelijk kunt doorlopen.
Gewijzigd op 16/08/2015 15:37:24 door Thomas van den Heuvel
 
Marcus geleyn

marcus geleyn

16/08/2015 16:18:07
Quote Anchor link
Thanks SanThe! Het werkt.


Thomas, ik heb dat al geprobeerd, maar dat kom ik een fout tegen. Ik heb onderstaande regel al in diverse uitvoeringen geprobeerd en dat zou inderdaad idealer zijn, maar het werkt niet.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$sql
= "SELECT id, member, land, therapie FROM users WHERE land = $keuzeland AND therapie = $keuze_therapie";
?>


$keuze_therapie bevat één getal, maar "therapie" is een array met 1 tot 120 getallen. Het zal toch niet "AND ($row)therapie=" moeten zijn zeker, dan eet ik mijn schoen op. Maar neen, dat kan niet, ik moet eerst explode doen en selecteren. Enfin, daar zit ik mee vast.
 
- SanThe -

- SanThe -

16/08/2015 16:29:13
Quote Anchor link
Je database opzet is niet ideaal.
Kijk eens naar normaliseren.
 
Marcus geleyn

marcus geleyn

16/08/2015 16:47:48
Quote Anchor link
Tja SanThe, daar heb ik al opmerkingen over gekregen, maar leden duiden via een keuzeformulier zelf alle therapieën aan en kunnen die later ook zelf wijzigen. de bijhorende getallen worden dan in een array opgeslagen.
 
- SanThe -

- SanThe -

16/08/2015 16:49:59
Quote Anchor link
Marcus geleyn op 16/08/2015 16:47:48:
de bijhorende getallen worden dan in een array opgeslagen.


En daar ga je fout.

Kijk eens naar koppeltabel.
Gewijzigd op 16/08/2015 16:50:57 door - SanThe -
 
Thomas van den Heuvel

Thomas van den Heuvel

16/08/2015 19:36:28
Quote Anchor link
Je kunt wel kijken of een waarde in een (kommagescheiden) geserialiseerde string zit, maar die optie is vaak verre van optimaal omdat je hiermee niet (goed) kunt zoeken, niet kunt optimaliseren etc.

De truuk is dat je een passage zoekt in een string, dit doe je met LOCATE.

Stel dat je je "array" hebt: "1,2,5,7" en je wilt kijken of deze waarde hier in zit. Zoeken op simpelweg "2" gaat niet werken omdat dit ook matches met "12" en "20" oplevert. Je moet er dus een komma voor en achter plakken: ",2,". Maar dan - als je in de bovenstaande string "7" zoekt (",7," dus) gaat dit niet werken. Daarom moet je aan deze kolom ook komma's plakken. Je komt dan dus tot de volgende oplossing:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
SELECT LOCATE(CONCAT(',', 6, ','), CONCAT(',', '1,2,5,7', ',')) > 0;

LOCATE retourneert de eerste karakter positie van de eerste parameter als deze voorkomt in de tweede parameter startende vanaf positie 1, of 0 als deze hier niet in voorkomt.
Met CONCAT kun je strings aan elkaar fietsen.

Toegepast op jouw query hierboven wordt dit dus zoiets (er vanuit gaande dat dit een kommagescheiden string is dus):
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
SELECT id, member, land, therapie
FROM users
WHERE land = $keuzeland
AND LOCATE(CONCAT(',', $keuze_therapie, ','), CONCAT(',', therapie, ',')) > 0

Maar ja, normaliseren is dus beter.
 
Marcus geleyn

marcus geleyn

16/08/2015 20:09:59
Quote Anchor link
Dag Tomas,
goed dat je me daar op attendeert, dat gaan we dan maar snel aanpassen en uitproberen. Bedankt!
 



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.