while conditie met array?
Stel ik heb een multidimensionale array:
Code (php)
1
2
3
4
2
3
4
foo
[0] => [color => red , size => small]
[1] => [color => blue, size => large]
[2] => [size => medium]
[0] => [color => red , size => small]
[1] => [color => blue, size => large]
[2] => [size => medium]
Is het dan mogelijk om met while door die array te lopen, zolang de key "color" geset is? Zoiets als dit (wat niet werkt):
Of gaat dat niet en moet ik gewoon een foreach loop gebruiken?
Gewijzigd op 25/06/2014 00:06:44 door Ozzie PHP
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
$foo[]= array('color' => 'red' , 'size' => 'small');
$foo[]= array('color' => 'blue', 'size' => 'large');
$foo[]= array('size' => 'medium');
$isKey = function($array)
{
return array_key_exists('color', $array) ? true : false;
};
$teller = 0;
while(in_array(true, array_map($isKey, $foo)))
{
$teller++;
echo $teller.'<br/>';
if(rand(1,3) == 1) unset($foo[0]);
sort($foo);
}
echo 'Klaar';
?>
$foo[]= array('color' => 'red' , 'size' => 'small');
$foo[]= array('color' => 'blue', 'size' => 'large');
$foo[]= array('size' => 'medium');
$isKey = function($array)
{
return array_key_exists('color', $array) ? true : false;
};
$teller = 0;
while(in_array(true, array_map($isKey, $foo)))
{
$teller++;
echo $teller.'<br/>';
if(rand(1,3) == 1) unset($foo[0]);
sort($foo);
}
echo 'Klaar';
?>
Code (php)
Ik had gedacht dat je met een while ook gewoon op een simpele manier door een array kon lopen... maar blijkbaar niet dus...
Maar ik vond de vraag wel interessant vandaar dat ik iets heb geprobeerd.
Het werkt prima in ieder geval.
Toevoeging op 25/06/2014 03:17:07:
De nuttige code is dit:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
<?php
$isKey = function($array)
{
return array_key_exists('color', $array) ? true : false;
};
while(in_array(true, array_map($isKey, $foo)))
{
// doe iets
}
?>
$isKey = function($array)
{
return array_key_exists('color', $array) ? true : false;
};
while(in_array(true, array_map($isKey, $foo)))
{
// doe iets
}
?>
Ik dacht dat een while loop is bedoeld om iets te doen, zolang aan de voorwaarde wordt voldaan. Die voorwaarde in het voorbeeldje hierboven is dat een bepaalde array-key is geset. Ik had dus gedacht dat ik die controle gewoon in de while-loop kon doen, if (isset(...)), maar dat lukt niet. De makkelijkste oplossing is dan toch gewoon met een foreach-loop denk ik. Wel jammer, want zo'n while loop lijkt me wel toepasselijk, maar als je allerlei trucs moet uithalen dan gaat de zin ervan een beetje verloren.
Mijn oplossing is toch vrij simpel en zo kan je een while gewoon gebruiken.
Ik heb jouw oplossing niet getest, maar waar het om gaat is dat ik iets met een element wil doen, als de array de key "color" bevat". Bij jouw oplossing moet je nu een extra functie maken die op zichzelf ook weer een functie aanroept. En dat geheel stop je dan weer in een functie in een functie in de while loop. Iets zegt mij dat mijn simpele foreach loopje dan een stukje efficiënter is, aangezien ik geen extra functies gebruik. Mijn hoop was dat je een array als expressie in de while loop kon gebruiken zodat je er doorheen kon itereren, maar juist dat lijkt dus niet te kunnen.
Het is nu vrij laat, dus ook niet helemaal meer helder.
Iemand anders misschien nog een idee??
Stackoverflow uit:
Niet exact wat je zoekt misschien, maar het gaat om de hoofdgedachte: je kunt array-iterators van PHP zelf lenen.
Kan die array meerdere niveaus diep zijn? Dan denk ik al gauw aan een recursieve iteratie en kom je bijvoorbeeld bij dit voorbeeld van Code (php)
Niet exact wat je zoekt misschien, maar het gaat om de hoofdgedachte: je kunt array-iterators van PHP zelf lenen.
Jij gebruikt nu ook foreach, maar mijn vraag was juist of je een while-loop kunt gebruiken met een array.
Ik wil dus iets met de array elementen doen zolang (in dit voorbeeld) de key "color" erin zit. Zodra er een element langskomt waar de key "color" niet in zit, dan moet de while-loop worden verlaten.
De gedachte was dus om een isset() expressie in de while te plaatsen: while (isset(...)), maar dat werkt blijkbaar niet. Blijkbaar kun je dus niet rechtstreeks een array in een while-loop stoppen. Tenzij ik iets verkeerd doe...
Het kan met een do-while in plaats van een while plus een conditie die de loop verlaat bij key != 'color'. Maar dat kan ook met een foreach die je verlaat met een break in een if. Per saldo is het effect dan hetzelfde: zodra de key niet meer 'color' is, wordt de loop verlaten.
Dat is inderdaad hoe ik het nu dus doe.
>> Het kan met een do-while in plaats van een while plus een conditie die de loop verlaat bij key != 'color'.
Kun je een voorbeeldje laten zien?
Of dat ook handig of slim is, hangt er vooral van af wat er in de array kan zitten, wat je uit de array wilt halen en hoe de conditie luidt.
Gewijzigd op 25/06/2014 14:18:17 door Ward van der Put
Dus die is niet zomaar met isset() op te vragen.
Tot nu toe lijkt dus foreach de enige (simpele) oplossing.
Code (php)
Is het een beter / efficiënter / logischer dan het ander denk je?
Code (php)
Grappig soms hoe zoiets simpels zoveel problemen kan opleveren.
Gewijzigd op 25/06/2014 14:39:36 door Erwin H
Blijkbaar ben ik niet de enige...
Bedankt voor je oplossing :)
Gewoon handmatig door de array heen itereren dus. Tja, daar had ik nog niet aan gedacht, haha...
P.S. Ik zie meestal $i++ ipv ++$i. Waarom kies je voor dat laatste?
Wat Ozzie zoekt is:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
while(er_bestaat_nog_ergens_een_array_in_een_element_met_als_key_'color'_in_het_tweedimensionaal_array)
{
....
}
?>
while(er_bestaat_nog_ergens_een_array_in_een_element_met_als_key_'color'_in_het_tweedimensionaal_array)
{
....
}
?>