[PHP] Foreach doet niet wat ik verwacht *

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Bpje
  • Registratie: November 2000
  • Laatst online: 25-04 22:59
Eerst een korte uitleg ik ben bezig met een grafiek ding (wie niet)
de eerste code is een stukje dat ik heb gebruikt als test.

PHP:
1
2
3
4
5
6
7
8
9
10
11
<?
$fruits = array ("a"=>"orange", "b"=>"banana", "c"=>"apple", "d"=>"lemon");

foreach ($fruits as $key => $value)
{
    print($key.' = '.$value.'<br/>');
    print($fruits[$key].'<br/>');   
    $k = key($fruits);
    print($fruits[$k].' = '.$k.'<br/>');    
}
?>

dit geeft het volgende als uitvoer:
a = orange
orange
orange = a
b = banana
banana
orange = a
c = apple
apple
orange = a
d = lemon
lemon
orange = a

Dat klopt volgens mij de foreach veranderd de pointer naar de array niet dus als je
PHP:
1
2
3
<?
$k = key($fruits); 
?>


aanroept blijft het eerste element terug komen.

nu heb ik dit gedaan :

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?
$i=0;
foreach ($dataArray as $key => $value) 
{ 
    $z=((($width-$XPOS)/($aantal-1))*$i)+$XPOS; 

    if ($i<(sizeof($dataArray)-1))
    {
        $tk = key($dataArray); 
        imageline($imgp,$z,($height-$YPOS)-($y*($dataArray[$key]-$gminh)),$z+(($width-$XPOS)/($aantal-1)),($height-$YPOS)-($y*($dataArray[$tk]-$gminh)),$rood);
    }
    $i++; 
} 
?>


in het kort gezegt tekent dit een lijntje, en ik kijk steeds naar het huidige punt en 1 verder. In $tk komt de tijdelijke key testaan en als ik het mag geloven is dat nooit de key waar je nu staat. (zie voorbeeld hierboven)

Maar het werkt toch volgens mijn zie ik hier wat over het hoofd.

Kan iemand mij vertellen waarom het in situatie 1 niet werkt en in situatie 2 wel

Acties:
  • 0 Henk 'm!

  • narotic
  • Registratie: Maart 2002
  • Laatst online: 02-11-2021
Sorry, maar ik snap echt niet wat je nu wilt :S

- = Step Into The Pit | Industrial Strength = -


Acties:
  • 0 Henk 'm!

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 02-09 11:02

D2k

ja gek he?
wat die je met die $k?
die zal wel steeds gelijk zijn

[ Voor 44% gewijzigd door D2k op 15-09-2003 15:10 ]

Doet iets met Cloud (MS/IBM)


Acties:
  • 0 Henk 'm!

  • Bpje
  • Registratie: November 2000
  • Laatst online: 25-04 22:59
Zal het proberen uitteleggen ik wil graag weten waarom het in situatie 1 niet werkt en waarom in situatie 2 wel.

http://www.scoutingharlingen.nl/temp/grafiek.gif

Acties:
  • 0 Henk 'm!

  • Bpje
  • Registratie: November 2000
  • Laatst online: 25-04 22:59
D2k schreef op 15 September 2003 @ 15:09:
ja gek he?
wat die je met die $k?
die zal wel steeds gelijk zijn
Nou $k = key($eenArray) geeft de huidige lokatie waar de pointer van de array naar wijst.

van php.net => key() returns the index element of the current array position.

[ Voor 35% gewijzigd door Bpje op 15-09-2003 15:14 ]


Acties:
  • 0 Henk 'm!

  • narotic
  • Registratie: Maart 2002
  • Laatst online: 02-11-2021
Print anders ff $tk in de loop, zie je vanzelf of de iterator werkt

- = Step Into The Pit | Industrial Strength = -


Acties:
  • 0 Henk 'm!

  • Bpje
  • Registratie: November 2000
  • Laatst online: 25-04 22:59
Hij werkt perfect, dat vind ik nou zo vreemd maar goed zal je advies opvolgen en eens kijken wat voor een verloop er in $tk zit

Heb het geprobeerd en hij geeft gewoon steeds de volgende key aan, ben dus geen steek verder.

Opzich hij doet het dus goed ;) vind het alleen wat raar.

[ Voor 40% gewijzigd door Bpje op 15-09-2003 15:22 ]


Acties:
  • 0 Henk 'm!

  • narotic
  • Registratie: Maart 2002
  • Laatst online: 02-11-2021
Hmm, vreemd. Normaal moet je next() aanroepen hiervoor, zoals je daarboven kan zien ligt het ook niet aan de foreach blijkbaar.

Ik begrijp dus goed dat $tk en $key steeds dezelfde waarde hebben? Probeer eens de foreach loop uit het stukje te elimineren ofzo.

- = Step Into The Pit | Industrial Strength = -


Acties:
  • 0 Henk 'm!

  • Bpje
  • Registratie: November 2000
  • Laatst online: 25-04 22:59
nou eigenlijk werkt het prima alleen vind ik het vreemd, $tk is in mijn source gewoon steeds de $key+1 maar als ik het als test probeer dan werkt het dus niet. en dat is wel erg vreemd.

Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Lees nog eens de manpage van foreach door, en kom erachter dat foreach itereert over een [b]kopievan het originele array. Ik gok dat je in dit geval een each/list combo wil gebruiken...

Klein gokje :)

---

Als je nu vertelt wat je nou wil bereiken, ipv vage halve verhalen te vertellen met wat er fout gaat, wij hebben helaas geen glazen bol beschikbaar, en degenen die er wel een hebben, functioneert niet altijd goed...

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • Bpje
  • Registratie: November 2000
  • Laatst online: 25-04 22:59
Ik wil niets naast het weten WAAROM het in geval 1 niet werkt en in geval 2 wel werkt.
Dus er is geen Glazen bol nodig, ik heb me zelf er al bij neer gelegt dath het zo is.

Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 12:56
Omdat je niet op de array zelf werkt, dus zoals je waarschijnlijk wel kunt raden veranderd die pointer ook niet.

Acties:
  • 0 Henk 'm!

  • Bpje
  • Registratie: November 2000
  • Laatst online: 25-04 22:59
Dat bedoel ik dus djluc, het werkt in het voorbeeld niet (zoals het hoort!) maar in het programma dus wel, en dat is nou precies wat zo vaag is.

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Maar waarom zou je nog een keer de Key opvragen als je die al hebt doormiddel van het foreach loopje? Beetje onnodig?

En zoals al gezegd is, kun je gewoon next() gebruiken om de pointer op de volgende index te zetten:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php

$fruits = array ("a"=>"orange", "b"=>"banana", "c"=>"apple", "d"=>"lemon"); 

foreach ($fruits as $key => $value) 
{ 
    print($key.' = '.$value.'<br/>'); 
    print($fruits[$key].'<br/>');     
    $k = key($fruits); //deze 
    next($fruits); // en deze regel zijn dus niet nodig
    print($fruits[$k].' = '.$k.'<br/>');     
} 
?>

[ Voor 23% gewijzigd door Michali op 16-09-2003 10:23 ]

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • Bpje
  • Registratie: November 2000
  • Laatst online: 25-04 22:59
Goed laten we er maar over op houden, want zo komen we er niet uit ik weet dat je next() kunt gebruiken en prev() voor de vorige maar waar het mij om ging is dat ik 2 situaties maak.
die inprinciepe het zelfde zijn maar niet allebij het zelfde werken.

Dat is het is het gene waarom het gaat. Het is ook wel op 1000 andere manieren op te lossen en die maniere kan ik zelf wel bedenken. De vraag is dan ook niet: "help het werkt niet" maar waarom werkt het zo wel en zo niet.

Iedereen bedankt voor zijn reactie.

Als ik het uit eindelijk weet post ik het nog wel.

Acties:
  • 0 Henk 'm!

Verwijderd

afgezien dat het gebruik van key() in je code *compleet* nutteloos is, is foreach in combinatie met key/count/each/next is gewoon brak; niet gebruiken of op vertrouwen.

voor een zooi problemen ermee lees het commentaar maar eens op
http://php.net/foreach

met name:
Apparently the internal array pointer is <i>not</i> incremented on the original array as the Note in the documentation for foreach says.
http://php.net/count

met name:
Be carefull with count when using in a while (list()=each()) construct, count changes the internal array pointer and strange things will happen :-)
volgende keer eerst commentaar op php.net doorlezen?

Acties:
  • 0 Henk 'm!

  • Bpje
  • Registratie: November 2000
  • Laatst online: 25-04 22:59
Tja, Je hebt helemaal gelijk.

Ik heb het onder tussen allemaal uit mijn source verbanne want het leverde meer problemen.

De vraag ik die ik steeds stel blijft staan waar om het in geval 1 wel werkt en in geval 2 niet.

Ik ben er voor dat dit dicht wordt gegooit, aangezien niemand het begrijpt wat er aan de hand is.

Nog maals bedankt.

[ Voor 12% gewijzigd door Bpje op 16-09-2003 15:03 ]


Verwijderd

Bpje: die vraag blijft niet staan.. sizeof is een alias voor count, die gebruik je in geval 2. en sizeof/count verneukt dus je interne array pointer..

  • Bpje
  • Registratie: November 2000
  • Laatst online: 25-04 22:59
Dat is iets waar ik wat aan heb. dus het werkt omdat in geval 2 gebruik wordt gemaakt van sizeof(). Zal het zo gelijk uit proberen.
Pagina: 1