While/list/each voor array loopt laatste key maar 1 keer
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)
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
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;
}
}
?>
$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.
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.
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)
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
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);
}
?>
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);
}
?>
Code (php)
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
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!
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().
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?
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