2013-08-10 33 views
5

Nikic another thread belirtilen:Neden foreach, 1 yerine 2 sayısını reddeder?

$array iterasyon foreachta kullanım için "yumuşak kopyalanmış" için Sağ [bir foreach] önce

.

$array = array(0, 1, 2); 
xdebug_debug_zval('array'); // refcount=1, is_ref=0 
          // so far so good 
foreach ($array as $key => $value) { 
    xdebug_debug_zval('array'); // refcount=3, is_ref=0 
}        // why is refcount 3 instead of 2? 

Sadece tarafından: Bu benim test kodu farklı bir sonuç gösteriyor, hiçbir gerçek kopya yapılır, ancak $array ait zval sadece refcount 2. Ancak

yükselmiştir demektir Kodlara baktığımızda, en fazla iki dizi değişkenini görebiliriz.

Neden refera 3?

foreach'dan sonra neden 2 refcount çalıştırılmıyor?

+0

Foreach döngüsünde, $ value değişkenini kullanarak dizi öğenize başvurmamalısınız? – Crackertastic

+0

@Crackertastic, döngü içinde hiçbir değişken kullanmıyorum. – Pacerier

+1

'Refcount' 2 alıyorum, bir şey mi eksik? dizi: (refcount = 2, is_ref = 0) = dizi (0 => (refcount = 1, is_ref = 0) = 0, 1 => (refcount = 1, is_ref = 0) = 1, 2 => (refcount = 2, is_ref = 0) = 2) ' – vee

cevap

1

xdebug_debug_zval() $ dizi değişkenine değil, $ anahtar değişkenine bakıyor. Eğer için kodunuzu değiştirirseniz :

foreach ($array as $key => $value) { 
    echo $key . " : " . $values . "<br>"; 
    //xdebug_debug_zval('array'); 

} 

dizinin doğru değerler iade edilecektir. Ben xdebug fonksiyonum yok, oraya koyduğun değeri test edemem.

+0

Kodunuzu test ettim ve 'xdebug_debug_zval ('dizi');' hala yerine '' 3'ü gösterir 2'. Dizinin değerlerini test etmiyorum, ancak dizinin yeniden sayımı. – Pacerier

+0

Tamam. Foreach döngüsünde iken xdebug ... değerini değiştirmeniz gerekecektir. Şu anda dizideki öğeye değil, dizinin tamamına bakarsınız. – jeff

+0

Dizideki öğeye bakmak istemiyorum .... Diziye bakıyorum çünkü * bu * bu sorunun ne olduğu. Dizi neden 2 yerine refcount 3'ü veriyor? – Pacerier