SORU
22 Kasım 2011, Salı


Başvuru PHP dosyalarda grup Pass: Eleman Çoğaltarak Son? (Hata?)

Ben sadece yazıyordum basit bir php komut dosyası ile bazı çok garip davranışları vardı. Minimum hata yeniden oluşturmak için gerekli için çalışır.

<?php

$arr = array("foo",
             "bar",
             "baz");

foreach ($arr as &$item) { /* do nothing by reference */ }
print_r($arr);

foreach ($arr as $item) { /* do nothing by value */ }
print_r($arr); // $arr has changed....why?

?>

Bu çıkışları:

Array
(
    [0] => foo
    [1] => bar
    [2] => baz
)
Array
(
    [0] => foo
    [1] => bar
    [2] => bar
)

Bu bir hata ya da olması gereken bu gerçekten garip bir davranış mı?

CEVAP
22 Kasım 2011, Salı


İlk foreach döngü sonra, $item yine de $arr[2] tarafından kullanılan bir değer bir başvuru. Başvuru çağırmaz ikinci döngü içinde her dosyalarda grup çağrı,, bu değer, ve böylece yeni değeri ile $arr[2], değiştirir.

1, değer ve $arr[2] $arr[0], hale döngü ''. foo
2 $arr[2] değeri döngü haline olan $arr[1],''. bar
3 $arr[2] değeri döngü haline olan $arr[2], '(çünkü döngü 2)'. bar

Değeri 'baz' aslında ikinci dosyalarda grup çağrısı kaybetti döngü.

Çıkış hata ayıklama

Döngünün her yineleme için, $item değeri, yinelemeli dizi baskı $arr gibi yankı ederiz.

İlk döngü çalıştırdığınızda, bu çıkışını görüyoruz:

foo
Array ( [0] => foo [1] => bar [2] => baz )

bar
Array ( [0] => foo [1] => bar [2] => baz )

baz
Array ( [0] => foo [1] => bar [2] => baz )

Döngünün sonunda, $item $arr[2] aynı yeri işaret ediyor.

İkinci döngü çalıştırdığınızda, bu çıkışını görüyoruz:

foo
Array ( [0] => foo [1] => bar [2] => foo )

bar
Array ( [0] => foo [1] => bar [2] => bar )

bar
Array ( [0] => foo [1] => bar [2] => bar )

Her zaman dizi $item, ona yeni bir değer koymak nasıl da her ikisi de hala aynı konuma işaret oldukları için, aynı değer $arr[3] güncelleme, fark edeceksiniz. Döngü dizisinin üçüncü değer için geldiğinde, biz de bu döngünün bir önceki yineleme tarafından ayarlanmış olduğu için değer bar içerir.

Bir hata mı?

Hayır. Bu başvurulan bir maddenin davranışı, ve bir hata var. Bir şey gibi çalışan benzer olacaktır:

for ($i = 0; $i < count($arr); $i  ) { $item = $arr[$i]; }

Bir foreach döngü başvurulan öğeleri göz ardı edebilirsiniz doğada özel değil. Sadece bir döngü dışında senin gibi yeni değeri her zaman için değişken ayar.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Canal de arkyoru

    Canal de ark

    18 Ocak 2007
  • LiquidMusick

    LiquidMusick

    23 Aralık 2010
  • tsweeney79

    tsweeney79

    21 Ocak 2008