មូលដ្ឋាន PHP (Beginner)

Operators + Control Structures

មេរៀននេះនឹងបង្រៀនអ្នកពី Operators (សញ្ញាគណនា) និង Control Structures (រចនាសម្ព័ន្ធគ្រប់គ្រង)។ រៀនពីមូលដ្ឋានរហូតដល់អាចសរសេរកម្មវិធីដោះស្រាយបញ្ហាតូចៗបាន។

PHP 8+ Beginner One File

១. Operators (សញ្ញាប្រមាណវិធី)

1.1 Arithmetic Operators (សញ្ញាគណនា)

ប្រើសម្រាប់ការគណនាចំនួន៖ បូក (+), ដក (-), គុణ (*), ចែក (/), សំណល់ (%)។

<?php
$a = 15;
$b = 4;
echo "$a + $b = " . ($a + $b);   // បូក
echo "\n$a - $b = " . ($a - $b); // ដក
echo "\n$a * $b = " . ($a * $b); // គុណ
echo "\n$a / $b = " . ($a / $b); // ចែក
echo "\n$a % $b = " . ($a % $b); // សំណល់
?>
▶ Output:
15 + 4 = 19
15 - 4 = 11
15 * 4 = 60
15 / 4 = 3.75
15 % 4 = 3

1.2 Assignment Operators (សញ្ញាកំណត់តម្លៃ)

ប្រើសម្រាប់កំណត់ ឬផ្លាស់ប្ដូរតម្លៃអថេរ៖ =, +=, -=, *=, /=

<?php
$x = 10;       // កំណត់តម្លៃ 10
$x += 5;       // $x = $x + 5   → 15
echo "After += 5: $x\n";
$x -= 3;       // $x = $x - 3   → 12
echo "After -= 3: $x\n";
$x *= 2;       // $x = $x * 2   → 24
echo "After *= 2: $x\n";
$x /= 4;       // $x = $x / 4   → 6
echo "After /= 4: $x\n";
?>
▶ Output:
After += 5: 15
After -= 3: 12
After *= 2: 24
After /= 4: 6

1.3 Comparison Operators (សញ្ញាប្រៀបធៀប)

ប្រៀបធៀបតម្លៃពីរ ហើយត្រឡប់ truefalse== ប្រៀបធៀបតម្លៃ, === ប្រៀបធៀបតម្លៃ + ប្រភេទ (type)។

<?php
$a = 5;  $b = "5";  $c = 10;

var_dump($a == $b);   // true  (តម្លៃដូចគ្នា)
var_dump($a === $b);  // false (ប្រភេទផ្សេងគ្នា: int vs string)
var_dump($a != $c);   // true
var_dump($a !== $b);  // true  (ផ្សេងប្រភេទ)
var_dump($a > $c);    // false
var_dump($a <= $b);  // true
?>
▶ Output:
$a == $b → true
$a === $b → false
$a != $c → true
$a !== $b → true
$a > $c → false
$a <= $b → true

1.4 Logical Operators (សញ្ញាឡូជីក)

&& (AND — ទាំងពីរពិត), || (OR — មួយក្នុងពីរពិត), ! (NOT — បញ្ច្រាស)។

<?php
$age = 20;
$hasID = true;

// AND: ទាំងពីរត្រូវពិត
echo ($age >= 18 && $hasID) ? "អាចចូលបាន" : "មិនអាចចូល";
echo "\n";

// OR: មួយក្នុងពីរពិតក៏គ្រប់គ្រាន់
$isVIP = false;
echo ($isVIP || $age >= 18) ? "អនុញ្ញាត" : "បដិសេធ";
echo "\n";

// NOT: បញ្ច្រាស
$isBanned = false;
echo !$isBanned ? "ស្វាគមន៍" : "អ្នកត្រូវបានហាមឃាត់";
?>
▶ Output:
អាចចូលបាន
អនុញ្ញាត
ស្វាគមន៍

1.5 Increment / Decrement (++ --)

Pre (++$x): បង្កើន​មុន​ រួច​ប្រើ​តម្លៃ។ Post ($x++): ប្រើ​តម្លៃ​មុន​ រួច​បង្កើន។

<?php
$x = 5;
echo "Start: $x\n";
echo "Post-increment: " . $x++ . "\n"; // បង្ហាញ 5 រួចបង្កើន
echo "After post-increment: $x\n";     // ឥឡូវ 6

$y = 5;
echo "Pre-increment: " . ++$y . "\n";  // បង្កើនមុន → 6
echo "After pre-increment: $y\n";      // នៅ 6

$z = 10;
echo "Pre-decrement: " . --$z . "\n";  // 9
echo "Post-decrement: " . $z-- . "\n"; // បង្ហាញ 9 រួចថយ
echo "Final: $z";                       // 8
?>
▶ Output:
Start: 5
Post-increment: 5
After post-increment: 6
Pre-increment: 6
After pre-increment: 6
Pre-decrement: 9
Post-decrement: 9
Final: 8

1.6 Concatenation (សញ្ញាភ្ជាប់ string)

. ភ្ជាប់ string ពីរ, .= ភ្ជាប់បន្ថែមទៅអថេរដែលមានស្រាប់។ នេះជា operator សំខាន់ក្នុង PHP។

<?php
$firstName = "សុខ";
$lastName  = "សាន";
$fullName  = $firstName . " " . $lastName;
echo "ឈ្មោះពេញ: " . $fullName . "\n";

// ប្រើ .= បន្ថែម string
$msg = "សួស្ដី";
$msg .= " សិស្សទាំងអស់គ្នា!";
echo $msg;
?>
▶ Output:
ឈ្មោះពេញ: សុខ សាន
សួស្ដី សិស្សទាំងអស់គ្នា!

🎮 Operator Playground

បញ្ចូលតម្លៃ A និង B រួចជ្រើសរើសប្រភេទ Operator ដើម្បីមើលលទ្ធផល៖

២. Control Structures (រចនាសម្ព័ន្ធគ្រប់គ្រង)

2.1a if / elseif / else — ឧទាហរណ៍ ១ (ពិន្ទុ)

if ពិនិត្យលក្ខខណ្ឌ។ បើពិត → ដំណើរការ Block ។ បើមិនពិត → ទៅ elseifelse

<?php
$score = 75;

if ($score >= 90) {
    echo "Grade A — ពូកែណាស់!";
} elseif ($score >= 80) {
    echo "Grade B — ល្អ!";
} elseif ($score >= 60) {
    echo "Grade C — មធ្យម។";
} else {
    echo "Grade F — ត្រូវខិតខំទៀត។";
}
?>
▶ Output:
Grade C — មធ្យម។

2.1b if / elseif / else — ឧទាហរណ៍ ២ (បញ្ចុះតម្លៃ)

សេណារីយ៉ូផ្សារ៖ បើទិញច្រើន → បញ្ចុះតម្លៃច្រើន។

<?php
$total = 150; // ដុល្លារ
$discount = 0;

if ($total >= 200) {
    $discount = 20; // 20%
} elseif ($total >= 100) {
    $discount = 10; // 10%
} elseif ($total >= 50) {
    $discount = 5;
} else {
    $discount = 0;
}

$final = $total - ($total * $discount / 100);
echo "ទឹកប្រាក់: \${$total} → បញ្ចុះ {$discount}% → សរុប: \${$final}";
?>
▶ Output:
ទឹកប្រាក់: $150 → បញ្ចុះ 10% → សរុប: $135

2.2 Nested if (if ក្នុង if)

ពិនិត្យលក្ខខណ្ឌច្រើនជាន់៖ ពិនិត្យអាយុមុន រួចពិនិត្យអត្តសញ្ញាណប័ណ្ណ។

<?php
$age = 20;
$hasLicense = true;

if ($age >= 18) {
    echo "អាយុគ្រប់គ្រាន់។\n";
    if ($hasLicense) {
        echo "✅ អាចបើកបរបាន!";
    } else {
        echo "❌ ត្រូវមានប័ណ្ណបើកបរ។";
    }
} else {
    echo "❌ អាយុមិនគ្រប់ 18 ឆ្នាំ។";
}
?>
▶ Output:
អាយុគ្រប់គ្រាន់។
✅ អាចបើកបរបាន!

2.3 switch...case (ជ្រើសរើសច្រើនជម្រើស)

ប្រើជំនួស if/elseif ច្រើន។ ចាំ break ដើម្បីបញ្ឈប់! default ដំណើរការបើគ្មាន case ណាត្រូវ។

<?php
$day = "Tuesday";

switch ($day) {
    case "Monday":
        echo "📅 ថ្ងៃចន្ទ — ចាប់ផ្ដើមសប្ដាហ៍!";
        break;
    case "Tuesday":
    case "Wednesday":
    case "Thursday":
        echo "📅 $day — ថ្ងៃរៀន។";
        break;
    case "Friday":
        echo "🎉 ថ្ងៃសុក្រ — ជិតចុងសប្ដាហ៍!";
        break;
    default:
        echo "🏖 ចុងសប្ដាហ៍ — សម្រាក!";
        break;
}
?>
▶ Output:
📅 Tuesday — ថ្ងៃរៀន។

🧪 Condition Tester

បញ្ចូល អាយុ និង ពិន្ទុ ដើម្បីមើលលទ្ធផលនៃ if/elseif/else និង nested if៖

៣. Loops (រង្វិលជុំ)

3.1 while Loop

ពិនិត្យលក្ខខណ្ឌ មុន ដំណើរការ។ បើ false ពីដំបូង → មិនដំណើរការសោះ។

<?php
$i = 1;
while ($i <= 5) {
    echo "រាប់: $i\n";
    $i++;
}
?>
▶ Output:
រាប់: 1
រាប់: 2
រាប់: 3
រាប់: 4
រាប់: 5

3.2 do...while Loop

ដំណើរការ យ៉ាងហោចម្ដង រួចពិនិត្យលក្ខខណ្ឌ។ ខុសពី while ដែលពិនិត្យមុន។

<?php
$num = 10;
do {
    echo "តម្លៃ: $num\n";
    $num -= 3;
} while ($num > 0);
echo "បញ្ចប់ — num = $num";
?>
▶ Output:
តម្លៃ: 10
តម្លៃ: 7
តម្លៃ: 4
តម្លៃ: 1
បញ្ចប់ — num = -2

3.3a for Loop — ឧទាហរណ៍ ១ (គុណ)

for(init; condition; increment) — ល្អប្រើពេលដឹងចំនួនដង។

<?php
// តារាងគុណ 7
for ($i = 1; $i <= 10; $i++) {
    echo "7 x $i = " . (7 * $i) . "\n";
}
?>
▶ Output:
7 x 1 = 7
7 x 2 = 14
7 x 3 = 21
7 x 4 = 28
7 x 5 = 35
7 x 6 = 42
7 x 7 = 49
7 x 8 = 56
7 x 9 = 63
7 x 10 = 70

3.3b for Loop — ឧទាហរណ៍ ២ (លេខគូ)

<?php
echo "លេខគូពី 2 ដល់ 20:\n";
for ($i = 2; $i <= 20; $i += 2) {
    echo "$i ";
}
?>
▶ Output:
លេខគូពី 2 ដល់ 20:
2 4 6 8 10 12 14 16 18 20

3.4a Nested Loops — ផ្កាយត្រីកោណ (Star Triangle)

loop ខាងក្រៅគ្រប់គ្រងជួរ (row), loop ខាងក្នុងគ្រប់គ្រងផ្កាយក្នុងជួរ។

<?php
$rows = 5;
for ($i = 1; $i <= $rows; $i++) {
    for ($j = 1; $j <= $i; $j++) {
        echo "* ";
    }
    echo "\n";
}
?>
▶ Output: * * * * * * * * * * * * * * *

3.4b Nested Loops — តារាងគុណ (Multiplication Table)

<?php
for ($i = 1; $i <= 5; $i++) {
    for ($j = 1; $j <= 5; $j++) {
        printf("%4d", $i * $j);
    }
    echo "\n";
}
?>
▶ Output:
×12345
112345
2246810
33691215
448121620
5510152025

3.5a foreach — បញ្ជីសាមញ្ញ

foreach loop តាមធាតុនីមួយៗក្នុង array។ មិនចាំបាច់ index។

<?php
$fruits = ["ចេក", "ម្នាស់", "ស្វាយ", "ទុរេន", "ល្ហុង"];

foreach ($fruits as $index => $fruit) {
    echo ($index + 1) . ". $fruit\n";
}
?>
▶ Output:
1. ចេក
2. ម្នាស់
3. ស្វាយ
4. ទុរេន
5. ល្ហុង

3.5b foreach — តារាង (Table)

<?php
$students = [
    ["name" => "សុខា",  "score" => 92, "grade" => "A"],
    ["name" => "វិចិត្រា", "score" => 78, "grade" => "C"],
    ["name" => "ដារ៉ា",  "score" => 85, "grade" => "B"],
    ["name" => "ចន្ធី",  "score" => 55, "grade" => "F"],
];

echo "<table><tr><th>ឈ្មោះ</th><th>ពិន្ទុ</th><th>Grade</th></tr>";
foreach ($students as $s) {
    echo "<tr><td>{$s['name']}</td><td>{$s['score']}</td><td>{$s['grade']}</td></tr>";
}
echo "</table>";
?>
▶ Output:
ឈ្មោះពិន្ទុGrade
សុខា 92 A
វិចិត្រា 78 C
ដារ៉ា 85 B
ចន្ធី 55 F

3.6 break & continue

break — ចេញពី loop ភ្លាម។ continue — រំលង​ដង​បច្ចុប្បន្ន ទៅដង​ក្រោយ។

<?php
// break: ឈប់ពេលជួប 5
for ($i = 1; $i <= 10; $i++) {
    if ($i === 5) break;
    echo "$i ";
}
// Output: 1 2 3 4
?>
▶ break:
1 2 3 4
<?php
// continue: រំលងលេខគូ
for ($i = 1; $i <= 10; $i++) {
    if ($i % 2 === 0) continue;
    echo "$i ";
}
// Output: 1 3 5 7 9
?>
▶ continue:
1 3 5 7 9

🔄 Loop Generator

ជ្រើសរើស ចំនួន (n) និង ប្រភេទ pattern ដើម្បីមើលលទ្ធផល៖

📋 Foreach Demo

ឧទាហរណ៍ foreach ជាមួយ array ផលិតផល៖

<?php
$products = [
    ["name" => "ទូរស័ព្ទ Samsung",  "price" => 350, "qty" => 12],
    ["name" => "Laptop Dell",       "price" => 780, "qty" => 5],
    ["name" => "Mouse Logitech",    "price" => 25,  "qty" => 40],
    ["name" => "Keyboard Corsair",  "price" => 65,  "qty" => 18],
    ["name" => "Monitor LG 27\"",   "price" => 290, "qty" => 8],
];

$totalValue = 0;
foreach ($products as $p) {
    $subtotal = $p['price'] * $p['qty'];
    $totalValue += $subtotal;
    echo "{$p['name']} — \${$p['price']} x {$p['qty']} = \$$subtotal\n";
}
echo "\nតម្លៃសរុប: \$$totalValue";
?>
▶ Output:
# ផលិតផល តម្លៃ ចំនួន សរុប
1 ទូរស័ព្ទ Samsung $350 12 $4,200
2 Laptop Dell $780 5 $3,900
3 Mouse Logitech $25 40 $1,000
4 Keyboard Corsair $65 18 $1,170
5 Monitor LG 27" $290 8 $2,320
តម្លៃសរុប: $12,590

📝 Practice Questions (លំហាត់)

Operators (៦ សំណួរ)

Q1

តើ 17 % 5 ស្មើប៉ុន្មាន? ហើយ 20 % 4 ស្មើប៉ុន្មាន? (ប្រាប់ចម្លើយទាំងពីរ)

💡 Hint: % (modulus) ត្រឡប់សំណល់នៃការចែក។ ឧ: 10 % 3 = 1 ព្រោះ 10 ÷ 3 = 3 សំណល់ 1។

Q2

តើអ្វីខុសគ្នារវាង == និង ===? ជ្រើសចម្លើយត្រឹមត្រូវ៖
A) == ប្រៀបធៀបតម្លៃ, === ប្រៀបធៀបតម្លៃ + ប្រភេទ
B) == ប្រៀបធៀបប្រភេទ, === ប្រៀបធៀបតម្លៃ
C) ដូចគ្នា មិនខុស
D) === ប្រើសម្រាប់ string តែប៉ុណ្ណោះ

💡 Hint: សាកល្បង: var_dump(5 == "5") និង var_dump(5 === "5")

Q3

តើកូដនេះបង្ហាញអ្វី?
$x = 10; $x += 5; $x *= 2; echo $x;

💡 Hint: គណនាម្ដងមួយ៖ 10 + 5 = ? រួចគុណ 2។

Q4

តើកូដនេះបង្ហាញអ្វី?
$a = 5; echo $a++ . " " . $a;

💡 Hint: Post-increment ($a++) ប្រើតម្លៃចាស់មុន រួចបង្កើន។

Q5

សរសេរកូដភ្ជាប់ variable $firstName និង $lastName ជាមួយដកឃ្លា ដោយប្រើ concat operator (.)

💡 Hint: ប្រើ . ដើម្បីភ្ជាប់ string និង " " ជា space។

Q6

តើលទ្ធផលអ្វី?
$a = true; $b = false; var_dump($a && $b); var_dump($a || $b); var_dump(!$a);

💡 Hint: && ពិតបើទាំងពីរពិត, || ពិតបើមួយពិត, ! បញ្ច្រាស។

Conditionals (៤ សំណួរ)

Q7

សរសេរកូដ if/elseif/else ដើម្បីពិនិត្យសីតុណ្ហភាព ($temp):
≥ 35 → "ក្ដៅខ្លាំង"
≥ 25 → "អាកាសធាតុល្អ"
ផ្សេង → "ត្រជាក់"

💡 Hint: ពិនិត្យពីលក្ខខណ្ឌធំជាងមុន (>= 35 មុន >= 25)។

Q8

សរសេរ nested if៖ ពិនិត្យ $age >= 18 មុន → រួចពិនិត្យ $score >= 50 ក្នុង។
បើអាយុគ្រប់ + ពិន្ទុគ្រប់ → "ជាប់"
បើអាយុគ្រប់ + ពិន្ទុមិនគ្រប់ → "ធ្លាក់"
បើអាយុមិនគ្រប់ → "មិនអាចប្រឡង"

💡 Hint: if ខាងក្រៅពិនិត្យអាយុ, if ខាងក្នុងពិនិត្យពិន្ទុ។

Q9

សរសេរ switch statement សម្រាប់ $month (1–12):
1–3 → "រដូវប្រាំង"
4–6 → "រដូវក្ដៅ"
7–9 → "រដូវវស្សា"
10–12 → "រដូវស្លឹកឈើជ្រុះ"
default → "មិនត្រឹមត្រូវ"

💡 Hint: ប្រើ case ផ្សំ (case 1: case 2: case 3: ... code ... break;)

Q10

តើកូដនេះបង្ហាញអ្វី? (ជ្រើសចម្លើយ)
$x = 15; if ($x > 20) { echo "A"; } elseif ($x > 10) { echo "B"; } elseif ($x > 5) { echo "C"; } else { echo "D"; }
A) A   B) B   C) C   D) D   E) BC

💡 Hint: PHP ពិនិត្យពីលើចុះក្រោម ហើយឈប់ពេលជួបលក្ខខណ្ឌពិតដំបូង។

Loops (៦ សំណួរ)

Q11

សរសេរ for loop បង្ហាញលេខសេស (odd) ពី 1 ដល់ 15។

💡 Hint: ប្រើ for($i=1; $i<=15; $i+=2) ឬ ប្រើ if($i%2 !== 0)។

Q12

សរសេរ while loop បង្ហាញរាប់ថយក្រោយពី 10 ទៅ 1 (countdown)។

💡 Hint: ចាប់ផ្ដើម $i = 10 រួចថយ $i-- រហូតដល់ $i >= 1។

Q13

តើ do...while ខុសពី while ដូចម្ដេច? សរសេរ do...while ដែលដំណើរការ ១ ដង ទោះលក្ខខណ្ឌ false។

💡 Hint: do...while ដំណើរការ body មុន រួចពិនិត្យលក្ខខណ្ឌ។

Q14

សរសេរ nested for loop បង្កើតត្រីកោណលេខ (n = 4):

1\n1 2\n1 2 3\n1 2 3 4

💡 Hint: loop ខាងក្រៅគ្រប់គ្រងជួរ ($i), loop ខាងក្នុង ($j) រាប់ពី 1 ដល់ $i។

Q15

មាន array: $prices = [120, 45, 200, 80, 300, 60];
ប្រើ foreach + if បង្ហាញតែតម្លៃ > 100 ហើយគណនាផលបូកតម្លៃទាំងនោះ។

💡 Hint: ប្រើ foreach loop រួម if($price > 100) ហើយបូកទៅ $total។

Q16

សរសេរ for loop ពី 1 ដល់ 20៖
— បើចែក 3 និង 5 ដាច់ → បង្ហាញ "FizzBuzz"
— បើចែក 3 ដាច់ → "Fizz"
— បើចែក 5 ដាច់ → "Buzz"
— បើមិនដាច់ → បង្ហាញលេខ
(ប្រើ continue ដើម្បីរំលងលេខ 13)

💡 Hint: ពិនិត្យ % 15 មុន (FizzBuzz), រួច % 3 (Fizz), រួច % 5 (Buzz)។ ប្រើ continue ពេល $i === 13។