Nasıl bir PHP foreach döngüsü bir dizi okunur?

6 Cevap php

Hepimiz bir for döngü içinde, biz bunu nasıl duymuş:

for ($i = 0, $count = count($array); $i < $c; ++$i)
{
    // Do stuff while traversing array
}

bunun yerine:

for ($i = 0; $i < count($array); ++$i)
{
    // Do stuff while traversing array
}

(yani her koşullu onay ile count() yerine çağırmak, sadece bir kez count() $count arardı başlatılıyor) performans nedenlerle.

Bir foreach döngü içinde, bunu, eğer o zaman da bir fark yaratır mı:

$array = do_something_that_returns_an_array();

foreach ($array as $key => $val)
{
    // Do stuff while traversing array
}

bunun yerine:

foreach (do_something_that_returns_an_array() as $key => $val)
{
    // Do stuff while traversing array
}

varsayarak şartlar beni ya da kullanmak için izin? Yani, PHP sadece bir kez her iki durumda işlevini çağrı yapar, ya da for, ikinci durumda tekrar tekrar işlevini çağırır nerede gibi?

6 Cevap

foreach() implemented using iterators - bu nedenle sadece bir kez bir dizi döndürür işlevini çağırır ve daha sonra her bir öğe ile devam edecek mevcut sonuca işaret yineleyici kullanır.

foreach giriş dizisinin bir kopyasını yapar ve her tekrarında bu konuda çalışıyor. Yani foreach (do_something_that_returns_an_array() as $key => $val) kullanabilir ve sadece bir kez do_something_that_returns_an_array() ararım.

Ben kesinlikle o cevap verecektir test düşünüyorum.

İşte benim kod:

function GetArray() {
    echo "I am called.\n";
    return array("One"=>1, "Two"=>2, "Three"=>3, "Four"=>4, "Five"=>5);
}

echo "Case #1\n";
$array = GetArray();
foreach ($array as $key => $val){
    // Do stuff while traversing array
    echo "    Inside the loop: $key => $val\n";
}
echo "\n";

echo "Case #2\n";
foreach (GetArray() as $key => $val) {
    // Do stuff while traversing array
    echo "    Inside the loop: $key => $val\n";
}
echo "\n";

ve burada sonuç:

Case #1
I am called.
    Inside the loop: One => 1
    Inside the loop: Two => 2
    Inside the loop: Three => 3
    Inside the loop: Four => 4
    Inside the loop: Five => 5

Case #2
I am called.
    Inside the loop: One => 1
    Inside the loop: Two => 2
    Inside the loop: Three => 3
    Inside the loop: Four => 4
    Inside the loop: Five => 5

Her ikisi de bir kez çağrı fonksiyonu okuyun. Yani hiçbir farklı.

Ben ne olacağını görmek için bir örnek olacak. Gibi bir şey ...

function do_something_that_returns_an_array() {
    echo 'I have been called!'; 
    return array('i am an', 'array');
}

As you can see on CodePad, it is only being called once.

Ben hep aksine döngü için, birden fazla kez çalıştırmak için hiçbir neden yok, çünkü do_something_that_returns_an_array() sadece bir kez çalışır farz ettik. Sebebi, her yinelemenin sonunda döngü gerçeği denetleyicisi koşular için çok karmaşık dama için izin vermektir.

Bir test olarak, ben şu ki:

function get_array() {echo 5; return array(1,2,3,4,5);}
foreach(get_array() as $key => $value) {}

Dosyası bir kez 5 basılmış. Bu nedenle, işlev get_array() sadece bir kez değerlendirir.

foreach () Iterator veya IteratorAggregate nesneleri (örneğin, diziler ve arabirimini uygulayan nesneler) ile çalışır. Bu immutable nesneleri ile çalışmak olamaz. Fonksiyonlar immutable nesneleri döndürmek, böylece dönen dizi (php kendisi tarafından yapılmış) foreaching önce Iterator nesnesine kopyalanmak zorunda