Sikllar — for, while, do-while, break, continue
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'lgandawhile (shart)— soni noma'lum; shartni o'zgartirishni unutmangdo { } while (...)— kamida bir martabreak— sikldan chiqish,continue— keyingi aylanishga o'tish- Cheksiz sikl —
Ctrl + Cbilan to'xtatiladi - Massivlar uchun
foreach— keyingi darslarda
Keyingi dars
11-dars: Massivlar — indeksli, assotsiativ, ko'p o'lchovli