while conditie met array?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

Ozzie PHP

Ozzie PHP

25/06/2014 00:05:40
Quote Anchor link
Hallo,

Stel ik heb een multidimensionale array:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
foo
   [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):

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
while (isset($foo['color'])) {
  // doe iets
}
?>

Of gaat dat niet en moet ik gewoon een foreach loop gebruiken?
Gewijzigd op 25/06/2014 00:06:44 door Ozzie PHP
 
PHP hulp

PHP hulp

29/03/2024 09:41:23
 
- SanThe -

- SanThe -

25/06/2014 02:59:03
Quote Anchor link
Beetje zitten testen en gevonden:
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
<?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';
?>
 
Ozzie PHP

Ozzie PHP

25/06/2014 03:09:02
Quote Anchor link
Hmmm, oké... thanks SanThe. Dat ziet er niet echt efficiënt uit als ik het vergelijk met een foreach-loop:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
foreach ($foo as $element) {
  if (isset($element['color'])) {
    // doe iets
  }
}

?>

Ik had gedacht dat je met een while ook gewoon op een simpele manier door een array kon lopen... maar blijkbaar niet dus...
 
- SanThe -

- SanThe -

25/06/2014 03:15:03
Quote Anchor link
Of het sneller is of niet weet ik niet.
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)
PHP script in nieuw venster Selecteer het PHP script
1
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
}
?>
 
Ozzie PHP

Ozzie PHP

25/06/2014 03:19:00
Quote Anchor link
Nou, het gaat me ook niet om sneller, maar meer om efficiënter...

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.
 
- SanThe -

- SanThe -

25/06/2014 03:21:47
Quote Anchor link
Ik zie het probleem niet.
Mijn oplossing is toch vrij simpel en zo kan je een while gewoon gebruiken.
 
Ozzie PHP

Ozzie PHP

25/06/2014 03:28:33
Quote Anchor link
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.
 
- SanThe -

- SanThe -

25/06/2014 03:33:50
Quote Anchor link
Misschien dat morgen iemand nog iets simpels kan verzinnen.
Het is nu vrij laat, dus ook niet helemaal meer helder.
 
Ozzie PHP

Ozzie PHP

25/06/2014 12:57:40
Quote Anchor link
Bedankt voor het meedenken SanThe...

Iemand anders misschien nog een idee??
 
Ward van der Put
Moderator

Ward van der Put

25/06/2014 13:10:02
Quote Anchor link
Kan die array meerdere niveaus diep zijn? Dan denk ik al gauw aan een recursieve iteratie en kom je bijvoorbeeld bij dit voorbeeld van Stackoverflow uit:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<?php
function recursiveFind(array $array, $needle)
{

    $iterator  = new RecursiveArrayIterator($array);
    $recursive = new RecursiveIteratorIterator($iterator, RecursiveIteratorIterator::SELF_FIRST);
    foreach ($recursive as $key => $value) {
        if ($key === $needle) {
            return $value;
        }
    }
}

?>


Niet exact wat je zoekt misschien, maar het gaat om de hoofdgedachte: je kunt array-iterators van PHP zelf lenen.
 
Ozzie PHP

Ozzie PHP

25/06/2014 13:17:23
Quote Anchor link
Nee, het is een simpele array zoals in mijn 1e voorbeeld.

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...
 
Ward van der Put
Moderator

Ward van der Put

25/06/2014 14:02:16
Quote Anchor link
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.
 
Ozzie PHP

Ozzie PHP

25/06/2014 14:07:28
Quote Anchor link
>> Maar dat kan ook met een foreach die je verlaat met een break in een if.

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?
 
Ward van der Put
Moderator

Ward van der Put

25/06/2014 14:17:59
Quote Anchor link
De conditie die je nu in if (conditie) hebt staan, plaats je dan in do { ... } while (conditie).

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
 
- SanThe -

- SanThe -

25/06/2014 14:24:01
Quote Anchor link
@Ward: Maar de conditie zit in een van de elementen in het array.
Dus die is niet zomaar met isset() op te vragen.
 
Ozzie PHP

Ozzie PHP

25/06/2014 14:25:08
Quote Anchor link
@SanThe, precies... ik heb even met do-while getest, maar ik krijg het nie werkend.

Tot nu toe lijkt dus foreach de enige (simpele) oplossing.
 
- SanThe -

- SanThe -

25/06/2014 14:29:18
Quote Anchor link
Ja, iets van:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
$boolean
= true;
while($boolean)
{

    foreach(.....)
    {

         $boolean = ($boolean and (conditie));
    }
}

?>
Gewijzigd op 25/06/2014 14:30:56 door - SanThe -
 
Ozzie PHP

Ozzie PHP

25/06/2014 14:32:31
Quote Anchor link
Dat zou kunnen. Of zo:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
foreach ($foo as $element) {
  if (isset($element['color'])) {
      // doe iets
  } else {
      break;
  }
}

?>

Is het een beter / efficiënter / logischer dan het ander denk je?
 
Erwin H

Erwin H

25/06/2014 14:37:39
Quote Anchor link
16 of zo reacties, omdat de TS gewoon blijkbaar niet weet hoe je een array correct aanspreekt...

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
<?php
$foo
= array(
   0 => array( 'color' => 'red' , 'size' => 'small' ),
   1 => array( 'color' => 'blue', 'size' => 'large' ),
   2 => array( 'size'  => 'medium' )
);


$i = 0;

while ( isset( $foo[$i]['color'] ) ){
  echo $foo[$i]['size'].'<br>';
  ++
$i;
}


echo '-- end --';
?>

Grappig soms hoe zoiets simpels zoveel problemen kan opleveren.
Gewijzigd op 25/06/2014 14:39:36 door Erwin H
 
Ozzie PHP

Ozzie PHP

25/06/2014 14:43:17
Quote Anchor link
>> 16 of zo reacties, omdat de TS gewoon blijkbaar niet weet hoe je en array correct aanspreekt...

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?
 
- SanThe -

- SanThe -

25/06/2014 14:43:50
Quote Anchor link
@Erwin: Maar je weet niet in welk element het gezochte 'color' zit.
Wat Ozzie zoekt is:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
while(er_bestaat_nog_ergens_een_array_in_een_element_met_als_key_'color'_in_het_tweedimensionaal_array)
{
    ....
}

?>
 

Pagina: 1 2 volgende »



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.