While/list/each voor array loopt laatste key maar 1 keer

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Joe Boos

Joe Boos

17/01/2014 20:26:48
Quote Anchor link
Hallo allemaal....

eerste post hier dus als er iets niet klopt...zeg het maar!

Ik heb een associative array waar ik doorheen ga met while loop. in deze loop moeten aan een paar eisen voldaan worden voor dat de volgende key en value gebruikt mag worden. grote functie maar de in het kort ff uitgelegd....

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
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?php

$array2
= array();

$array1 = array('key1' => '5', 'key2' => '4', 'key3' => '3','key4' => '3', 'key5' => '2');

reset($array1);


while (list ($key,$value) = each($array1))
{


//functie die een (tijdelijke) array maakt met $key en $value

//check tijdelijke array met foreach
////bij fout increment $errors



     if ($errors >= 1)
     {

     //echo 'errors : '.$errors.'';

     prev($array);
                    
     }

     else
     {

     current($array);
             
        $array2 = $array2+$temp_array;
        }

}


?>


het werkt en als er een fout is word de key nog een keer gebruikt tot er geen fout meer is.....alleen als er bij de laatste key in de array een fout is loopt hij niet nog een keer. ben begonnen met een foreach loop for $array1 maar die stelt mij niet in staat om 1 voor 1 de array te doorlopen.

verschillende combinaties van each(),current(),next() en prev() hielpen ook niet.

heb al dingen opgezocht en het komt waarschijnlijk door de internal pointer al op de laatste key staat en dan de while loop dan stopt. kan dat? geeft word er een true/false gegeven als het einde van de array bereikt?

hoe zorg ik nu dat die laatste key nog een keer doorlopen word als er een fout is?

BVD j.
 
PHP hulp

PHP hulp

12/05/2024 10:33:52
 
Erwin H

Erwin H

17/01/2014 22:23:56
Quote Anchor link
Dat komt omdat each de interne pointer in de array naar het volgende element in de array zet. Met prev zet je die weer terug naar de vorige. Kom je echter bij de laatste dan bestaat het volgende element niet. De pointer wordt dus niet naar de volgende gezet, maar naar null. Null is niets en als je dus de vorige wil hebben (met prev) dan kan dat helemaal niet.

Wat je mogelijk zou kunnen doen is om de uitkomst van prev te testen op false (wel met de stricte === operator!) en als het false is om dan met end() de array pointer weer op de laatste te zetten. Ik kan echter niet overzien of je dat andere problemen zou opleveren.
 
Joe Boos

Joe Boos

18/01/2014 00:44:09
Quote Anchor link
Bedankt voor de duw in de juiste richting!

tijdens testen met de strikte vergelijking werd de code wel erg instabiel en kwam vaak niet eens verder als de eerste sleutel....maar mischien ook logisch. ik vergeleek/teste met prev() en als de pointer op 0 staat is er geen vorige sleutel en is er niks te vergelijken dacht ik. dus ik ben current() gaan vergelijken...

laatste gedeelte van de code is als volgt nu en lijkt stabiel.

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
22
23
24
25
26
27
28
29
30
31
<?php


                    if (($errors >= 1) and (current($array1)===false))
                    {

                    //echo 'errors : '.$errors.' and false on array';
                        
                        end($array1);
                        
                        unset($temp_array);
                    }

                    elseif($errors >= 1))
                    {

                    //echo 'errors : '.$errors.'';
                        
                        prev($array1);
                        
                        unset($temp_array);
                    }
                    
                    else
                    {

                        current($array1);
            
                        $array2 = $array2+$temp_array;
                        
                        unset($temp_array);
                    }



?>
 
Willem vp

Willem vp

18/01/2014 01:43:49
Quote Anchor link
Ik vind het eerlijk gezegd een beetje een vage constructie. Volgens mij bedoel je eigenlijk dit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
   foreach ($array as $key => $value)
   {

      do
      {
         # Iets met $key en $value
      } while ($errors);
   }

?>
 
Frank Nietbelangrijk

Frank Nietbelangrijk

18/01/2014 02:13:16
Quote Anchor link
Hoe korter de code hoe overzichtelijker. Volgens mij volstaat dit ook.

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
<?php
    if($errors >= 1)
    {

        if(current($array1)===false) // we waren bij het laatste element van de array
            end($array1);
        else
            prev($array1);
    }
                    
    else
    {
        $array2 = $array2+$temp_array;
    }

    
    unset($temp_array);
?>


Toevoeging op 18/01/2014 02:29:44:

@Willem

Nee met een foreach kun je nooit een stap terug gaan.
Indien je drie elementen hebt in een array zal de volgorde altijd zijn: 1e, 2e, 3e
en dit kan dan niet maar wel met een while: 1e, 2e, 2e, 3e
 
Joe Boos

Joe Boos

18/01/2014 09:46:08
Quote Anchor link
Allebei bedankt voor de reactie!

willem, in de eerste post stond ook dat ik al een foreach loop had gebruikt maar dan kan ik idd niet 1 voor 1 de array doorlopen.

Ik zal de korte constructie zeker proberen. Dank!
 
Willem vp

Willem vp

18/01/2014 13:04:52
Quote Anchor link
Joeri Bossink op 18/01/2014 09:46:08:
willem, in de eerste post stond ook dat ik al een foreach loop had gebruikt maar dan kan ik idd niet 1 voor 1 de array doorlopen.

Euh... het idee achter een foreach-loop is júist dat je een array 1 voor 1 doorloopt... ;-)

In jouw geval wil je het huidige element van de array nog een keer verwerken als er een fout optreedt, en dat wordt in mijn geval dus geregeld door de do-while-loop die in de foreach staat. Vind ik zelf een stuk doorzichtiger dan dat gerommel met prev().
 
Joe Boos

Joe Boos

18/01/2014 13:48:27
Quote Anchor link
oke...ik snap 'm. ongeveer.....heb nog niet met do/while gewerkt.

voor de check op fouten zitten nog diverse functies om een array te creeren die gechecked word op fouten. ik heb dit zo geschreven zodat ik weet dat elke tijdelijke array gecontroleerd word en van voor af aan herschreven in het geval van een fout en dat doet tot er geen dubbele entries in de tijdelijke en $array2.

hoe handeld de do/while dan als er geen $error is?
 
Willem vp

Willem vp

18/01/2014 14:23:55
Quote Anchor link
Als er geen $error is (of beter gezegd: als $error de waarde 0 of false heeft) dan wordt alles in de do-while 1x uitgevoerd en wordt vervolgens de do-while beëindigd. De rest van de foreach-loop wordt dan uitgevoerd.

Eigenlijk is do-while hetzelfde als een gewone while, met als enige verschil dat de loop-conditie achteraf wordt getest in plaats van vooraf.
Gewijzigd op 18/01/2014 14:24:44 door Willem vp
 



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.