Döngüler arasındaki fark

11 Cevap php

Bu PHP ile ilgili ama ben hiç şüphesiz aynı yorumların diğer birçok dilde uygulanacaktır ettik.

Basitçe söylemek gerekirse, PHP için döngünün farklı tip farklar nelerdir? Bir hızlı / diğerlerinden daha iyi ya da ben sadece en okunabilir döngü koymak gerekir mi?

for ($i = 0; $i < 10; $i++)
{
	# code...
}


foreach ($array as $index => $value)
{
	# code...
}


do
{
	# code...
}
while ($flag == false);

11 Cevap

For döngüsü ve döngüler giriş koşulu döngüler olsa. Onlar ilk koşulu değerlendirmek, bu yüzden durumu karşılamak için başarısız olursa döngü ile ilişkili deyim blok kez bile çalışmaz

Döngü bloğu için bu içindeki ifadeler Doları değeri i 0-9 olacak, 10 kez çalışacak;

for ($i = 0; $i < 10; $i++)
{
        # code...
}

Aynı şey ise döngü ile yapılır:

$i = 0;
while ($i < 10)
{
    # code...
    $i++
}

Do-while döngü çıkış koşulu döngü. Daha sonra bu blok tekrarlanmadan önce durumu değerlendirecek, bir kez çalıştırmak için garanti

do
{
        # code...
}
while ($flag == false);

foreach başından sonuna kadar bir dizi öğelerini erişmek için kullanılır. Foreach döngüsünün başlangıcında, dizinin iç işaretçi dizisi sona kadar bu şekilde devam eder 2. dizinin öğesi olarak ayarlandığında ve bir sonraki aşamada, dizinin birinci elemanın ayarlanır. Döngü bloğundaki güncel dizi öğesinin değeri $ değer olarak kullanılabilir ve geçerli öğenin anahtar $ indeksi olarak kullanılabilir.

foreach ($array as $index => $value)
{
        # code...
}

Böyle iken döngü ile aynı şeyi yapabilirdi

while (current($array))
{
    $index = key($array);  // to get key of the current element
    $value = $array[$index]; // to get value of current element

    # code ...	

    next($array);	// advance the internal array pointer of $array
}

Ve son olarak: The PHP Manual arkadaşın :)

Bu CS101, ama döngüler kod bloğu önce kendi durumunu değerlendirmek, ve do-while kod bloğundan sonra değerlendirir, o esnada hiç kimse, o sözü beri do-while döngüleri her zaman en az bir kez kendi kod bloğu çalıştırmak için garantili, bağımsız olarak durumun.

@ brendan:

Eğer alıntı makale ciddi eskidir ve bilgi sadece düz yanlış. Özellikle son nokta yanıltıcı ve makalede sunulan gerekçe artık. NET modern versiyonları için geçerlidir (yerine foreach Kullanım for).

O IEnumerator sanal aramaları kullandığı doğru olsa da, bu can aslında modern bir derleyici tarafından özümlenemediğinde. Ayrıca,. Şimdi NET jenerikler ve güçlü yazılmış enumerator'ler bilir.

for foreach daha hızlı genellikle olduğunu ispat orada performans testleri bir yeri vardır. Here's an example.

Bir ilişkisel dizi ile uğraşırken bir geleneksel (endeksli?) Dizi ve foreach döngüsü üzerinde yineleme zaman ben ilk döngü kullanmak. Bu sadece doğal görünüyor ve bence kod akışı ve daha okunabilir olması, yardımcı olur. Gelince ben sadece bir dizi gezinin daha yapmak zorunda döngüler, ben bu kullanmak do ... while.

Ama, herhangi bir performans faydaları emin değilim.

Performans durumda da önemli ölçüde daha iyi değildir. Iken yineleme daha karmaşık görevler için yararlıdır, ama for ve while işlevsel eşdeğerdir.

Foreach güzel, ama önemli bir ihtar vardır: can't modify enumerable sen yineleme ediyoruz. Yani, kaldırma ekleyerek veya içinde / girişleri değiştirme yok. (Bunların özelliklerini değiştirme gibi) girdilerini değiştirerek tabii ki, Tamam.

Bir foreach döngüsü ile, orijinal dizinin bir kopyasını içinde kullanmak üzere bellekte yapılır. Büyük yapılar bunları kullanmak gerekir; döngüsü için basit bir iyi bir seçimdir. Böyle büyük bir non-sayısal dizin yapısı üzerinde daha verimli bir while döngüsü kullanabilirsiniz:

while(list($key, $value) = each($array)) {

Ama bu yaklaşım, basit küçük bir yapı için özellikle çirkin.

döngüler akışları döngü veya PHP çok sık görmek aşağıdaki örnekte olduğu gibi daha uygundur ise:

while ($row = mysql_fetch_array($result)) {

Hemen hemen tüm zamanların farklı döngüler değiştirilebilir, ve bir) verimliliği, veya b) açıklık ya da aşağı gelecektir.

Eğer döngü farklı verimliliği trade-off biliyorsanız, o zaman evet, özgün soru cevap: en temiz görünüyor birini kullanın.

Her döngü yapısı, farklı bir amaca hizmet eder.

için - bu iterasyon belirli sayıda döngü için kullanılır.

foreach - Bu koleksiyonda tüm değerleri döngü kullanılır.

- Sen bir koşulu karşılayacak kadar bu döngü için kullanılır.

Üçü arasında, "ise" büyük olasılıkla çoğu durumda en iyi performansı sağlayacaktır. Eğer aşağıdaki gibi bir şey yaparsanız tabii ki, temelde (c # biraz daha performanslı olduğu) döngü "için" yeniden edilir.

$count = 0;
do
{
   ...
   $count++;
}
while ($count < 10);

Hepsi farklı temel amaçları vardır, ama aynı zamanda biraz aynı şekilde kullanılabilir. Bu tamamen size çözmeye çalıştığınız belirli bir soruna bağlıdır.

Bir foreach döngüsü ile, orijinal dizinin bir kopyasını içinde kullanmak üzere bellekte yapılır.

Foreach güzel, ama önemli bir ihtar vardır: Eğer yineleme konum enumerator değiştiremezsiniz.

Yerine değeri referans geçmesi halinde her ikisi de bu bir sorun olmayacak:

 foreach ($array as &$value) {

Bu PHP 5'ten beri izin olmuştur düşünüyorum.

Bir dizinin elemanlarını erişirken mümkün, açıklık için bir foreach kullanmak, ve (örneğin, birden dizilerde aynı dizin) gerçek endeks değerleri gerekiyorsa sadece bir kullanın. Döngüler için bu çok kolay yapmak için bu da yazım hatası hatalar için şansını en aza indirir. Genel olarak, PHP yer performansı hakkında çok fazla endişe edilecek olmayabilir. Ve son ama en az değil, ve foreach (ya da olmalıdır, ben bir PHP-er değilim) aynı Big-O zaman (O (n)) yani bellek kullanımı ya da küçük bir miktar daha az olasılıkla arıyoruz zaman içinde vurmak hafif bir sabit veya doğrusal.

Performans açısından, bir foreach daha tüketen bir için daha

http://forums.asp.net/p/1041090/1457897.aspx