[php] next() na kopie variabele; bug?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • JeRa
  • Registratie: Juni 2003
  • Laatst online: 30-04 10:28

JeRa

Authentic

Topicstarter
Ik was bezig met een lastig algoritme dat maar niet wilde werken, toen ik plotseling op dit stuitte:
PHP:
1
2
3
4
5
6
7
8
9
10
11
$a = array(1, 2, 3);
echo current($a);
echo next($a);
echo next($a);

reset($a);

echo current($a);
echo next($a);
$b = $a;
echo next($a);

Verwacht resultaat:
123123

Werkelijk resultaat:
123122

Zodra je die regel '$b = $a' eruit haalt werkt 't weer naar behoren. Hierdoor word ik geforceerd om een extra next() te gebruiken om de internal pointer op de goede plek te krijgen. Is dit normaal gedrag van next()?

ifconfig eth0 down


Acties:
  • 0 Henk 'm!

  • Vae Victis
  • Registratie: April 2001
  • Laatst online: 07-09 06:15

Vae Victis

Dark Lord of the Sith

code:
1
$b = $a;

Daar kopieer je een array.
Na die actie is de interne positie in desbetreffende array de eerste plaats.

Test het maar eens met meer waardes en loop daar doorheen.
Want met 3 waardes verkijk je er snel op.

Acties:
  • 0 Henk 'm!

  • JeRa
  • Registratie: Juni 2003
  • Laatst online: 30-04 10:28

JeRa

Authentic

Topicstarter
Je hebt gelijk. Maar waarom zou PHP de array $a veranderen (de interne pointer dus) als ik duidelijk aangeef dat ik $a wil kopiëren naar $b? Vreemd gedrag... :?

ifconfig eth0 down


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 21:01
Waarschijnlijk gebruikt PHP die interne pointer ook zelf bij het kopiëren van een array. Wel vreemd, omdat ik ik verwacht had dat ze wel een of andere copy-on-write aanpak zouden gebruiken.

Maar goed, het hele idee van arrays met een 'interne pointer' is nogal slecht naar mijn mening. Je krijgt er allemaal obscure bugs als deze door, omdat het ontzettend ondoorzichtig is welke operaties die interne pointer nu wel of niet resetten (denk aan allerlei sorteerfuncties). Een relatief veilige manier om 'm te gebruiken is ervoor te zorgen dat je:
• voor je begint, een reset() hebt uitgevoerd
• in de lus waarin je de calls naar next() hebt staan, je helemaal niets met je oorspronkelijk array doet.
Maar nog veiliger is die constructie helemaal nooit gebruiken en gewoon foreach te gebruiken. Dat is een heel stuk makkelijker en de kans op obscure bugs is veel kleiner.

[ Voor 3% gewijzigd door Soultaker op 05-06-2004 19:00 ]


Acties:
  • 0 Henk 'm!

  • JeRa
  • Registratie: Juni 2003
  • Laatst online: 30-04 10:28

JeRa

Authentic

Topicstarter
Bedankt :)

foreach in mijn algoritme gebruiken gaat niet op aangezien ik een multidimensionale array heb waarin een ID-array zit waarop elke 'wending' een next() moet worden uitgevoerd. Ik heb het opgelost door ervoor te zorgen dat die ID-array niet meer wordt gekopieerd, maar nog, ik blijf het vreemd vinden :Y)

ifconfig eth0 down