Ngu ngơ học làm web (55) - Vòng lặp trong PHP

Tiếp theo của: Ngu ngơ học làm web (54) - Bài tập về câu lệnh điều kiện
------

Phần 55.       Vòng lặp trong PHP

Đây là clip số 10: vòng lặp for


Các loại vòng lặp: for, while, do…while và for…each.

Đây là ví dụ về vòng lặp for,

            <ol>
                        <?php
                        for($i = 1; $i <= 10; $i++) {
                                    echo '<li> Học vòng lặp for </li>';
                        }
                        ?>
            </ol>

Đây là clip số 11: vòng lặp while


Vòng lặp while:

$i = 0;
  while ($i < 10) {
    echo 'Lần lặp thứ ' . $i . '<br>';
    $i++;
  }

Từ clip trên, suy nghĩ về hành động bấm nút trên giao diện và xuất tam giác: việc bấm nút được thực hiện trên giao diện tại web client, nghĩa là đang tác động vào một đối tượng DOM tại máy client. Trong khi việc kiểm tra xem người dùng đã bấm vào nút nào và xuất tam giác thì lại do đoạn mã tại web server thực hiện. À vậy là phải có một cách gì đó để trao đổi, liên lạc giữa web client và web server.

Cách liên lạc là: web client sẽ quy ước, mỗi nút sẽ ứng với một số, và web client sẽ gửi nút đã được chọn thông qua tham số type của thẻ <a>, sau đó web server sẽ kiểm tra tham số type này trong mảng $_GET, tại phần tử $_GET[‘type’]. Thực chất ở đây là dùng phương thứ GET để gửi dữ liệu. 

Ví dụ,
<ul>
                        <a href="for.php?type=1"><li>Tam giác 1</li></a>
                        <a href="for.php?type=2"><li>Tam giác 2</li></a>
                        <a href="for.php?type=3"><li>Tam giác 3</li></a>
            </ul>

Hàm str_repeat(‘kí tự’, ‘số lần lặp’) để xuất lặp lại một kí tự.

Đây là clip số 12: vòng lặp while (tiếp theo)


Đây là mã của chương trình in tam giác, lưu lại để tham khảo:

<!DOCTYPE html>
<html>
<head>
 <meta charset="utf-8">
 <title>PHP</title>
 <style>
 * {
  margin: 0;
  padding: 0;
}
.content {
  width: 600px;
  height: 400px;
  border: 1px solid green;
  margin: 20px auto;
  text-align: center;
}
h1 {
  text-align: center;
  padding: 10px 0;
  color: red;
}
.tam-giac {
  width: 100px;
  height: 100px;
  border: 2px solid red;
  display: inline-block;
  margin-left: 10px;
}
img {
  width: 100%;
  height: 100%;
}
.result {
  text-align: left;
  margin-left: 265px;
}
</style>
</head>
<body>
  <div class="content">
    <h1>Vẽ tam giác</h1>
    <div class="tam-giac"><a href="?type=1"><img src="tam-giac-1.jpg" alt=""></a></div>
    <div class="tam-giac"><a href="?type=2"><img src="tam-giac-2.jpg" alt=""></a></div>
    <div class="tam-giac"><a href="?type=3"><img src="tam-giac-3.jpg" alt=""></a></div>
    <div class="result">
    <?php
    $result = '';
    if (isset($_GET['type'])) {
      $type = $_GET['type'];
      switch ($type) {
        case '1':
        $i = 1;
        while($i <= 6) {
          $result .= str_repeat('*', $i) . '<br>';
          $i++;
        }
        break;
        case '2':
        $i = 6;
        while($i >= 1) {
          $result .= str_repeat('*', $i) . '<br>';
          $i--;
        }
        break;
        case '3':
        $i = 1;
        while($i <= 6) {
          $space = str_repeat('&nbsp;&nbsp;', 6 - $i);
          $character = str_repeat('*', 2*$i - 1);
          $result .= $space . $character . '<br>';
          $i++;
        }
        break;
        default:
        break;
      }
    }
    echo $result;
    ?>
  </div>
</body>
</html>

Đây là clip số 13: vòng lặp do – while


Ví dụ,

$i = 10;
    do {
      echo 'Chạy ít nhất một lần!';
      $i++;
    } while ($i <= 5);

Đây là mã của chương trình hiển thị hình ảnh, lưu lại để tham khảo:

<!DOCTYPE html>
<html>
<head>
 <meta charset="utf-8">
 <title>PHP</title>
 <style>
 * {
  margin: 0;
  padding: 0;
}
.content {
  width: 600px;
  height: 400px;
  border: 1px solid green;
  margin: 20px auto;
  text-align: center;
}
h1 {
  text-align: center;
  padding: 10px 0;
  color: red;
}

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <style>
    .content {
      width: 300px;
      margin: 0px auto;
      border: 1px solid #444;
      text-align: center;
      padding: 10px;
    }
    .content h1 {
      color: red;
    }
    .content div.image {
      margin: 20px 0px;
    }
    .content div.image img{
      margin: 20px 0px;
    }
    .content div.image a {
      display: inline-block;
      background: #994F82;
      color: #FFFDD3;
      padding: 3px 10px;
      text-decoration: none;
    }
    .content div.image a:hover {
      color: #9BCC61;
    }  
  </style>
</head>
<body>
  <div class="content">
    <h1>Xem ảnh</h1>
    <div class="image">
      <?php
        $i = 1;
        do {
          echo '<img src="images/' . $i . '.jpg">';
          $flagShow = 0;
          if(isset($_GET['show'])) {
            $flagShow = $_GET['show'];
            $i++;
          }
        }while($i <= 10 && $flagShow);
      ?>
      <a href="?show=1">Xem toàn bộ</a>
      <a href="?show=0">Xem một hình</a>
    </div>
  </div>
</body>
</html>

Đây là clip số 14: break và continue, sự khác nhau giữa nháy đơn và nháy kép


- break: thoát khỏi một vòng lệnh, sử dụng để nhảy ra khỏi một vòng lặp.

Ví dụ,

// in 10 số chẵn đầu tiên
  $i = 1;
  $n = 0;
  while (1) {
    if ($i % 2 == 0 && $n < 10) {
      echo $i . '<br>';
      $n++;
    } else if ($n == 10) {
      break;
    }
    $i++;
  }

- continue: dừng vòng lặp tại giá trị đó và nhảy sang giá trị khác trong vòng lặp.

Ví dụ,

  // in 10 số chẵn đầu tiên
  for ($i = 1; $i <= 20; $i++) {
    if ($i % 2 != 0) {
      continue;
    }
    echo $i . '<br>';
  }

PHP xem chuỗi được bao bởi dấu nháy đơn là chuỗi tuyệt đối. Với chuỗi được bao bởi dấu nháy đôi, PHP sẽ xử lý để tìm các biến trong chuỗi để biên dịch. Do vậy, PHP xử lý chuỗi với dấu nháy đơn sẽ nhanh hơn. Chạy đoạn mã sau để thấy sự khác biệt giữa chuỗi được bao bởi dấu nháy đơn và dấu nháy đôi.

<?php
                        $a = 'bien a';
                        $b = 'bien b';
                        echo "Giá trị của biến a: $a <br>";
                        echo 'Giá trị của biến b: $b';
?>

Đây là clip số 15: bài tập về vòng lặp (yêu nhau ghét nhau)


Lưu ý: bài giải của tác giả trong clip chưa chính xác. Gọi x là số quả cau yêu, y là số quả cau ghét, thì sẽ hợp lý hơn, khi đó: 3x + 10y = 100 và x + y = 17. Kết quả là, số người yêu nhau là 30, số người ghét nhau là 70.

for ($x = 1; $x <= 17; $x++)
    for ($y = 1; $y <= 17; $y++) {
      if (3*$x + 10*$y == 100 && $x + $y == 17) {
        echo 3*$x . ' người yêu nhau' . ':' . 10*$y . ' người ghét nhau';
      }

    }
-----------
Cập nhật [7/9/2020]
-----------
Xem thêm: