Gebeurt dit enkel op Linux, of heeft dit op Windows andere uitwerkingen?
Just interesting. Ik heb het ook even voorgelegd aan Tweakers. Toch benieuwd hoe dit zit. Op Linux speelt dit wel onder alle versies, waaronder de EOL.
Update: Ook op Windows speelt het.
"$b blijft een referentie naar het laatste element uit de eerste loop." zegt iemand daar.
unset($b); na je eerste foreach zou moeten helpen.
Toch zijn hulplijntjes wel eens handig :P
En ja, PHP blijft een 'dumb programmer language'
Wat je hier allemaal aan het doen bent is toch redelijk onorthodox. Je gebruikt hier call-by-reference op $b. En dan worden van arrays pas kopieën gemaakt als hier waarden in worden gewijzigd. Je hebt geen enkel idee van wat dit onder water voor effect heeft qua geheugenreferenties en waarden. Het is een aanpak waarbij je een heleboel zaken niet ziet. Simpelweg omdat je niet begrijpt wat er gebeurt maakt iets nog niet fout. Je moet je afvragen of het gebruik van een & hier wel verstandig is (waarschijnlijk niet). Er zijn immers legio manieren om dit op een manier te doen waarbij het effect makkelijker te doorgronden is.
Dit werkt altijd, en maakt wat mij betreft expliciet duidelijk wat de bedoeling is:
Daarbij, als je dan toch volhardt in een aanpak met een referentie, dan loont het op zijn minst de moeite om er in commentaar bij te vermelden wat het eigenlijk zou moeten doen. Als dit dan niet voldoet aan de specificatie, dan weet je op zijn minst hoe je dit moet veranderen. Dit verdient ook in algemene zin de voorkeur. Het kan je later helpen om de draad weer op te pakken als je de code een tijd niet gezien hebt.
Het probleem is dus overigens niet $a. De waarden in $a bevatten na afloop van de eerste foreach-loop de correcte waarden. Het is die $b, die je gebruikt om in de tweede loop $a te dumpen. Die, zoals in die Tweakers discussie wordt aangehaald, blijft bestaan buiten de scope van de eerste foreach-loop. Niet helemaal netjes, maar soit. Op het moment dat je referenties gaat gebruiken moet je gewoon héél erg goed opletten.
Als je het volgende doet dan geeft dit gewoon het gewenste resultaat:
Nou nee, het zijn toch voornamelijk dumb programmers. PHP heeft nou eenmaal een aantal quirks en is ook heel laagdrempelig en accepteert veel, heel veel. Daarom is het zaak dat dit gecompenseerd wordt door enige programmeerdiscipline die menig (beginnend) "programmeur" gewoon (nog) niet heeft.
Ik zou gewoon wegsturen van een oplossing met referenties als je deze niet nodig hebt. Omdat dit dus onvoorziene consequenties kan hebben maar ook omdat er gewoon andere constructies zijn die veel transparanter zijn dan wat hier gebeurt.
Wat je hier allemaal aan het doen bent is toch redelijk onorthodox.
Je hebt ABSOLUUT gelijk :)
Dit was slechts een testje. Ik wist dat de ampersand werkte in functies. Ik wist echter niet dat dit kon in een foreach en plots kwam ik dit tegen in een ander topic.
Mijn bedoeling was dus ook om gewoon even te testen hoe dit werkte. Niet om te gebruiken. Normaal werk ik dus ook met de key over de echte array.
Soms zijn het de stomme testjes, of programmeurs, die fouten vinden.
Volgens mij is het sowieso een bug.
Toch allen bedankt voor de input en het mee testen.
Jan