PHP Foreach ile Dizi Değeri Değişimi

ampersand ampersand   Eğer bir diziyi foreach döngüsüne sokar ve bu döngü içerisinde dizi değişkenlerinde değişiklik yapıp bunları foreach döngüsünün dışında kullanmaya çalışırsanız hayal kırıklığı yaşar, benim gibi şaşırır kalırsınız.

Örneğin aşağıdaki kodu çalıştırdığınızda çıktının "kayıt-ol/" olmasını beklerken, geriye "kayıt-ol" dönecektir. Halbuki foreach döngüsünün içerisinde echo $p; ile değişkeni okumak isterseniz "kayit-ol/" değişikliğinin yapıldığını göreceksiniz.

 <?php $permalink_struct = array(); $permalink_struct['register'] = "kayit-ol"; $permalink_struct['logout'] = "cikis"; $permalink_struct['login'] = "giris";

foreach ($permalink_struct as $p) { $p .= '/'; } echo $permalink_struct['register']; // Sonuç "kayit-ol" olacaktır. ?>

Neden?

Burada nedeni yazıyor:

Note: Unless the array is referenced, foreach operates on a copy of the specified array and not the array itself.

PHP foreach döngülerine diziyi değil, dizinin bellekteki bir kopyasını sokarmış. Bu yüzden sizin foreach içinde yaptığınız değişiklikler dizinin kopyasında etkili oluyor ve siz foreach döngüsünden çıktıktan sonra (haliyle) orijinal diziye yansıtılyormuş.

Çözüm?

Dizinin orijinalini foreach döngüsüne sokmak için dizinin referansını (pointer) foreach'e parametre olarak vermeniz yeterli olacaktır. Bunu da dizi değişkeninin başına & (ampersand) operatörü koyarak sağlayabilirsiniz.

Kodun yeni hali aşağıdaki gibi olur ve çıktı olarak "kayıt-ol/" verir.

 <?php $permalink_struct = array(); $permalink_struct['register'] = "kayit-ol"; $permalink_struct['logout'] = "cikis"; $permalink_struct['login'] = "giris";

foreach ($permalink_struct as &$p) { $p .= '/'; } // Sıradaki $permalink_struct verisinin ADRESİNİ $p'ye ata. echo $permalink_struct['register']; // Sonuç "kayit-ol/" olacaktır. ?>