Sikllar — for, while, do-while, break, continue

~15 daq · PHP · Boshqaruv tuzilmalari

Muammodan boshlaylik

Sahifada 1 dan 10 gacha sahifa raqamlarini (pagination) chiqarish kerak:

<?php

echo "<a href='?p=1'>1</a>";
echo "<a href='?p=2'>2</a>";
echo "<a href='?p=3'>3</a>";
// ... yana 7 ta

Sahifalar soni 10 emas, 250 bo'lsa-chi? Yoki bazadagi mahsulotlar soniga qarab o'zgarsa-chi? Bir xil ishni ko'p marta takrorlash uchun — sikllar bor.


for — necha marta ekanligi aniq bo'lganda

<?php

for ($i = 1; $i <= 5; $i++) {
    echo "Sahifa $i\n";
}

Natija:

Sahifa 1
Sahifa 2
Sahifa 3
Sahifa 4
Sahifa 5

Qavs ichida 3 qism bor, ; bilan ajratilgan:

Qism Misol Qachon bajariladi
Boshlanish $i = 1 Bir marta, eng boshida
Shart $i <= 5 Har aylanishdan oldin; false bo'lsa — to'xtaydi
Qadam $i++ Har aylanishdan keyin

Pagination muammosini hal qilamiz:

<?php

$sahifalarSoni = 7;

for ($i = 1; $i <= $sahifalarSoni; $i++) {
    echo "<a href='?p=$i'>$i</a> ";
}

Boshqa qadamlar:

<?php

for ($i = 10; $i >= 1; $i--) {     // teskari: 10, 9, ..., 1
    echo $i . " ";
}

for ($i = 0; $i <= 100; $i += 25) { // 25 lab: 0, 25, 50, 75, 100
    echo $i . " ";
}

while — shart bajarilguncha

Necha marta aylanishi oldindan noma'lum bo'lganda:

<?php

$balans = 100000;
$oylar = 0;

while ($balans < 200000) {
    $balans = $balans * 1.05;   // har oy 5% o'sish
    $oylar++;
}

echo "Ikki baravar bo'lishi uchun $oylar oy kerak";   // 15 oy

while shartni har aylanishdan oldin tekshiradi. Shart boshidanoq false bo'lsa — sikl bir marta ham bajarilmaydi.

Real hayotda while ko'pincha bazadan qatorlarni o'qishda ishlatiladi:

<?php

// PDO darsida batafsil ko'ramiz
while ($qator = $natija->fetch()) {
    echo $qator['nom'];
}

do-while — kamida bir marta

do-while shartni oxirida tekshiradi. Shuning uchun tana kamida bir marta albatta bajariladi:

<?php

$i = 10;

do {
    echo "Bu bir marta chiqadi: $i\n";
    $i++;
} while ($i < 5);

Shart boshidanoq false (10 < 5), lekin matn baribir bir marta chiqdi. Amalda kam ishlatiladi — masalan "noyob kod yarat, agar bazada bor bo'lsa — qaytadan yarat":

<?php

do {
    $kod = random_int(100000, 999999);
} while (kodBazadaBormi($kod));

Cheksiz sikl — eng ko'p uchraydigan xato

<?php

$i = 1;

while ($i <= 5) {
    echo $i;
    // ❌ $i++ unutildi — $i doim 1, shart doim true
}

Dastur to'xtamaydi. Brauzerda sahifa yuklanaveradi, terminalda raqamlar oqib ketaveradi. PHP odatda 30 soniyadan keyin o'zi to'xtatadi:

Fatal error: Maximum execution time of 30 seconds exceeded

Terminalda to'xtatish uchun — Ctrl + C.

Qoida: har bir while da shartni oxir-oqibat false qiladigan narsa bo'lishi shart.


break — siklni to'xtatish

<?php

$sonlar = [4, 8, 15, 16, 23, 42];

foreach ($sonlar as $son) {
    if ($son > 10) {
        echo "Birinchi 10 dan katta son: $son";
        break;   // topdik — qolganini tekshirish shart emas
    }
}
// Birinchi 10 dan katta son: 15

(foreach — massivlar uchun maxsus sikl, 12-darsda batafsil.)


continue — shu aylanishni o'tkazib yuborish

<?php

for ($i = 1; $i <= 10; $i++) {
    if ($i % 2 === 0) {
        continue;   // juft bo'lsa — pastdagi kodni o'tkazib, keyingi aylanishga o't
    }
    echo $i . " ";
}
// 1 3 5 7 9

break — sikldan butunlay chiqadi. continue — faqat joriy aylanishni tashlab, keyingisiga o'tadi.


Ichma-ich sikllar

<?php

for ($qator = 1; $qator <= 3; $qator++) {
    for ($ustun = 1; $ustun <= 3; $ustun++) {
        echo $qator * $ustun . "\t";
    }
    echo "\n";
}
1	2	3
2	4	6
3	6	9

Tashqi sikl bir marta aylanganda — ichki sikl to'liq aylanadi. 3 × 3 = 9 marta jami.

[!WARNING] Ichma-ich sikllar tez sekinlashadi: 1000 × 1000 = 1 000 000 ta aylanish. Ayniqsa ichki siklda bazaga so'rov yuborsangiz — sahifa daqiqalab yuklanadi. Bu "N+1 muammo" deyiladi, keyinroq ko'ramiz.


HTML ichida sikl — alternativ sintaksis

<ul>
<?php for ($i = 1; $i <= 3; $i++): ?>
    <li>Element <?= $i ?></li>
<?php endfor; ?>
</ul>

while uchun — endwhile;, foreach uchun — endforeach;.


Qaysi siklni tanlash kerak?

Holat Sikl
Necha marta — aniq (1 dan N gacha) for
Massiv elementlari ustida yurish foreach
Shart bajarilguncha, soni noma'lum while
Kamida bir marta bajarilishi shart do-while

Nima uchun shunday?

Nima uchun dasturchilar sikl o'zgaruvchisini $i deb nomlashadi?

Bu matematikadan keladi — yig'indi belgisida (Σ) indeks i, j, k harflari bilan yoziladi. Fortran tilida esa (1957) I dan N gacha harflar bilan boshlangan o'zgaruvchilar avtomatik butun son bo'lgan. Odat shunday qolib ketgan. Qisqa sikllarda $i normal. Lekin ma'nosi bor bo'lsa — ma'noli nom bering: $sahifa, $qator, $oy.


Xulosa

Eslab qoling:

  • for (boshlanish; shart; qadam) — soni aniq bo'lganda
  • while (shart) — soni noma'lum; shartni o'zgartirishni unutmang
  • do { } while (...) — kamida bir marta
  • break — sikldan chiqish, continue — keyingi aylanishga o'tish
  • Cheksiz sikl — Ctrl + C bilan to'xtatiladi
  • Massivlar uchun foreach — keyingi darslarda

Keyingi dars

11-dars: Massivlar — indeksli, assotsiativ, ko'p o'lchovli