1.6 Shartlar (if/else)¶
β¬ οΈ Oldingi: 1.5 Matn bilan ishlash (string) Β· π README Β· Keyingi: 1.7 Takrorlash (sikllar) β‘οΈ
Hozirgacha dasturimiz har doim bir xil ishni bajarardi. Lekin haqiqiy dasturlar qaror qabul qilishi kerak: "agar foydalanuvchi katta bo'lsa β ruxsat ber, aks holda β berma", "agar narx yetarli bo'lsa β sotib ol". Ana shu "agar..." mantig'i β shartlar orqali yoziladi. Bu β dasturlashning eng muhim tushunchalaridan biri.
Oddiy if¶
if so'zi "agar" degani. Qavs ichiga shart yoziladi; agar shart rost (true) bo'lsa, { } ichidagi kod ishlaydi:
Bu yerda: "agar yosh 18 dan katta yoki teng bo'lsa, xabarni chiqar". Yosh 20 bo'lgani uchun shart rost β xabar chiqadi.
Tuzilishini ko'ring:
- if β "agar".
- ( ) ichida β tekshiriladigan shart (1.4'da ko'rgan taqqoslash amallari shu yerda ishlatiladi).
- { } ichida β shart rost bo'lsa bajariladigan kod.
if ... else β "aks holda"¶
else so'zi "aks holda" degani: agar shart yolg'on bo'lsa, else ichidagi kod ishlaydi:
<?php
$yosh = 15;
if ($yosh >= 18) {
echo "Ruxsat berildi";
} else {
echo "Ruxsat berilmadi"; // yosh 15, shart yolg'on β shu chiqadi
}
Faqat ikkitadan bittasi ishlaydi: yoki if ichidagi, yoki else ichidagi.
if ... elseif ... else β bir nechta holat¶
Ko'pincha ikkitadan ko'p holat bo'ladi. elseif ("aks holda agar") qo'shimcha shartlarni tekshiradi:
<?php
$ball = 75;
if ($ball >= 90) {
echo "A baho";
} elseif ($ball >= 80) {
echo "B baho";
} elseif ($ball >= 70) {
echo "C baho"; // 75 bu yerga to'g'ri keladi
} else {
echo "Yiqildi";
}
PHP shartlarni yuqoridan pastga tekshiradi va birinchi rost bo'lganida to'xtaydi. $ball = 75 uchun: 90 dan katta emas, 80 dan katta emas, 70 dan katta β ha! "C baho" chiqadi va qolgani tekshirilmaydi.
Quyidagi blok-sxema shu oqimni ko'rsatadi: har shart navbat bilan tekshiriladi, birinchi rost tarmoq bajariladi.
Mantiqiy amallar β bir nechta shartni birlashtirish¶
Ba'zan bir vaqtda bir nechta shart tekshirilishi kerak. Buning uchun:
&&β "va" (ikkala shart ham rost bo'lishi kerak)||β "yoki" (kamida bittasi rost bo'lsa yetarli)!β "emas" (rostni yolg'onga, yolg'onni rostga aylantiradi)
<?php
$yosh = 25;
$pul = 100000;
// "va" β ikkala shart ham rost bo'lishi kerak
if ($yosh >= 18 && $pul >= 50000) {
echo "Sotib olishingiz mumkin";
}
// "yoki" β bittasi rost bo'lsa yetarli
$kun = "shanba";
if ($kun == "shanba" || $kun == "yakshanba") {
echo "Bugun dam olish kuni";
}
&& ni "ham...ham" deb, || ni "yo...yo" deb o'qing.
Misol: juft yoki toq sonni aniqlash¶
1.4'da o'rgangan % (qoldiq) amalini eslang. Agar son 2 ga bo'linganda qoldiq 0 bo'lsa β u juft son:
<?php
$son = 7;
if ($son % 2 == 0) {
echo "Juft son";
} else {
echo "Toq son"; // 7 % 2 = 1, qoldiq 0 emas β toq
}
switch β bitta qiymatni ko'p variant bilan solishtirish¶
Ba'zan bitta o'zgaruvchini ko'p qiymatlardan biriga teng-emasligini tekshiramiz. if/elseif bilan bu uzun chiqadi. switch shu holat uchun toza ko'rinish beradi:
<?php
$kun = "seshanba";
switch ($kun) {
case "shanba":
case "yakshanba":
echo "Dam olish kuni";
break; // bu variant tugadi β chiqib ket
default:
echo "Ish kuni"; // hech qaysi case mos kelmasa
}
switch ($kun)β qaysi o'zgaruvchini tekshirayotganimiz.case "shanba":β "agar$kun"shanba"ga teng bo'lsa". Ikkicaseketma-ket yozilsa (yuqorida shanba/yakshanba) β ikkalasi uchun bir xil kod ishlaydi.break;β JUDA muhim: variant tugaganini bildiradi. Unutsangiz, PHP keyingicasega ham "tushib" ketadi (fall-through) β ko'p uchraydigan xato.default:β hech qaysi variant mos kelmaganda (xuddielsekabi).
Qachon
switch, qachonif? Bitta qiymatni aniq variantlarga solishtirsangiz ($kun"shanba"mi, "yakshanba"mi...) βswitchtoza. Oraliq/murakkab shartlar bo'lsa (yosh >= 18 && pul > 0) βif/elseif.
match β switch'ning zamonaviy, ixcham ko'rinishi (PHP 8+)¶
match β switch'ning yangi, qulayroq versiyasi. Farqi: u qiymat qaytaradi, break shart emas, va qat'iy (=== β ham qiymat, ham tur) solishtiradi:
<?php
$baho = 85;
$harf = match(true) {
$baho >= 90 => "A",
$baho >= 80 => "B", // 85 shu yerga to'g'ri keladi
$baho >= 70 => "C",
default => "F",
};
echo $harf; // B
- Har bir variant
shart => natijako'rinishida, vergul bilan ajratiladi. - Natija to'g'ridan-to'g'ri
$harfga saqlanadi βechoyokibreakyozish shart emas. match(true)β "qaysi sharttruebo'lsa" degani (oraliqlarni tekshirishda qulay). Aniq qiymatlarni solishtirsangiz,match($kun)deb yozasiz:
<?php
$kun = "seshanba";
echo match($kun) {
"shanba", "yakshanba" => "Dam olish kuni",
default => "Ish kuni",
};
Why:
matchif/elseifning eng toza ko'rinishi β "bir qiymatga qarab turli natija" kerak bo'lganda ishlating. Bir necha variantni bitta natijaga ulash uchun ularni vergul bilan sanang. (2.9 β Enum bo'limidamatchni yana ko'ramiz.)
Qisqa shartli yozuvlar: ternary (?:) va ??¶
Kichik shartlarni bitta qatorda yozishning qisqa yo'llari bor.
Ternary (?:) β "agar... bo'lsa buni, aks holda buni":
<?php
$yosh = 20;
// To'liq if/else o'rniga:
$holat = ($yosh >= 18) ? "katta" : "kichik";
echo $holat; // katta
shart ? rost_bo'lsa : yolg'on_bo'lsa β bu kichik tanlovlar uchun qulay. Lekin uni murakkablashtirib yubormang (ichma-ich ternary o'qishni qiyinlashtiradi) β murakkab bo'lsa, oddiy ifga qayting.
Null-coalescing (??) β "agar bor va null bo'lmasa o'shani, aks holda zaxira qiymatni":
<?php
// $_GET['ism'] bor bo'lsa o'shani, bo'lmasa "Mehmon"
$ism = $_GET['ism'] ?? "Mehmon";
$sozlama = [];
$til = $sozlama['til'] ?? "uz"; // 'til' kaliti yo'q β "uz"
echo $til; // uz
?? ayniqsa foydalanuvchi ma'lumoti bilan ishlaganda ($_GET, $_POST, massiv kalitlari) juda ko'p kerak bo'ladi: "kalit bormi? bo'lsa qiymatini ol, bo'lmasa standart qiymat ber" β bularning hammasi bitta ?? bilan, xatosiz.
Diqqat:
??faqatnull(yoki "umuman yo'q") holatini tekshiradi.?:esa har qanday "falsy" (bo'sh, 0) qiymatda zaxiraga o'tadi. Foydalanuvchi ma'lumotini olishda odatda??to'g'riroq.
Mashqlar¶
Oson
1. Bir yosh o'zgaruvchisi yarating. Agar 18 dan katta bo'lsa, "Voyaga yetgan" deb chiqaring.
2. Bir songa if/else yozing: agar 100 dan katta bo'lsa "katta son", aks holda "kichik son".
3. Bir sonning juft yoki toqligini aniqlang (% 2 bilan).
4. Bir baho (0-100) o'zgaruvchisi: agar 60 dan katta yoki teng bo'lsa "O'tdi", aks holda "Yiqildi".
5. Bir ob-havo o'zgaruvchisi ($harorat): agar 0 dan kichik bo'lsa "Sovuq" deb chiqaring.
O'rta
6. Baho tizimini elseif bilan yozing: A (90+), B (80+), C (70+), D (60+), F (qolgani).
7. Foydalanuvchi yoshi 18-65 oralig'idami, tekshiring (&& bilan: >= 18 va <= 65).
8. Kun nomini tekshiring: shanba yoki yakshanba bo'lsa "dam olish", aks holda "ish kuni" (|| bilan).
9. Login tekshiruvi: $ism == "admin" va $parol == "12345" bo'lsa "Xush kelibsiz", aks holda "Xato".
10. Bir son musbat, manfiy yoki nolligini aniqlang (uchta holat: > 0, < 0, == 0).
Qiyin
11. Oddiy "chegirma" mantig'i: agar xarid summasi 100000 dan katta bo'lsa, 10% chegirma hisoblang va yakuniy narxni chiqaring; aks holda to'liq narxni chiqaring.
12. Yil kabisa (visokosniy) yilmi? Maslahat: yil 4 ga bo'linsa kabisa, lekin 100 ga bo'linsa kabisa emas, agar 400 ga bo'linsa yana kabisa. (Bu β % va mantiqiy amallarning yaxshi mashqi. Avval soddaroq: faqat "4 ga bo'linadimi" bilan boshlang.)
13. Eng katta sonni topish: uchta son berilgan, ularning eng kattasini aniqlang va chiqaring (if/elseif yoki && bilan).
14. switch bilan: hafta kuni raqami (1β7) berilganda, uning nomini chiqaring (1 β "Dushanba" ... 7 β "Yakshanba"); noto'g'ri raqam uchun defaultda "Noma'lum kun".
15. match bilan: baho (0β100) berilganda harf bahosini qaytaring (A/B/C/D/F) va chiqaring.
16. Ternary va ?? bilan: $_GET['ism'] bo'lsa undan, bo'lmasa "Mehmon" oling (??), keyin ternary bilan "Salom, <ism>" yoki uzunligi 3 dan kichik bo'lsa "Ism juda qisqa" chiqaring.
Yechim β 9
<?php
$ism = "admin";
$parol = "12345";
if ($ism == "admin" && $parol == "12345") {
echo "Xush kelibsiz!";
} else {
echo "Login yoki parol xato";
}
&& tufayli ikkala shart ham to'g'ri bo'lsagina "Xush kelibsiz" chiqadi. Birortasi xato bo'lsa β else ishlaydi.
Yechim β 11
Yechim β 12 (kabisa yil)
<?php
$yil = 2024;
// Kabisa: 4 ga bo'linsa, LEKIN 100 ga bo'linmasa; YOKI 400 ga bo'linsa
$kabisa = ($yil % 4 == 0 && $yil % 100 != 0) || ($yil % 400 == 0);
if ($kabisa) {
echo "$yil β kabisa yil";
} else {
echo "$yil β oddiy yil";
}
Tekshirib ko'ring: 2000 β kabisa (400 ga bo'linadi), 1900 β oddiy (100 ga bo'linadi, lekin 400 ga emas), 2024 β kabisa (4 ga bo'linadi, 100 ga emas). Mantiq murakkab ko'rinsa ham, uni so'z bilan o'qing: "4 ga bo'linadi va 100 ga bo'linmaydi β yoki 400 ga bo'linadi". && va || ni qavslar bilan to'g'ri guruhlash bu yerda kalit.
Yechim β 13 (eng katta son)
<?php
$a = 12;
$b = 45;
$c = 23;
if ($a >= $b && $a >= $c) {
echo "Eng katta: " . $a;
} elseif ($b >= $a && $b >= $c) {
echo "Eng katta: " . $b;
} else {
echo "Eng katta: " . $c; // bu holatda 45
}
$a eng katta bo'lishi uchun u ham $b dan, ham $c dan katta (yoki teng) bo'lishi kerak β shuning uchun &&.
Yechim β 14 (switch bilan hafta kuni)
<?php
$raqam = 3;
switch ($raqam) {
case 1: echo "Dushanba"; break;
case 2: echo "Seshanba"; break;
case 3: echo "Chorshanba"; break; // 3 β shu yer ishlaydi
case 4: echo "Payshanba"; break;
case 5: echo "Juma"; break;
case 6: echo "Shanba"; break;
case 7: echo "Yakshanba"; break;
default: echo "Noma'lum kun";
}
casedan keyin break borligiga e'tibor bering β usiz keyingi kunlar ham "tushib" chiqib ketardi.
Yechim β 15 (match bilan harf bahosi)
<?php
$baho = 73;
$harf = match(true) {
$baho >= 90 => "A",
$baho >= 80 => "B",
$baho >= 70 => "C", // 73 β shu yer
$baho >= 60 => "D",
default => "F",
};
echo $harf; // C
match(true) oraliqlarni tekshirish uchun ideal: yuqoridan pastga, birinchi true bo'lgan shartning natijasini qaytaradi. 1.6'dagi if/elseifli baho tizimi bilan solishtiring β match ancha ixcham.