Ngu ngơ học làm web (85) - Filter và validate trong PHP

Tiếp theo của: Ngu ngơ học làm web (84) - Bài tập upload tập tin
-----

Phần 85.       Filter và validate trong PHP


Đây là clip số 96:


Filter và validate được sử dụng để kiểm tra dữ liệu trước khi thao tác với nó.

- Validate: xác nhận, kiểm tra xem dữ liệu có đáp ứng các yêu cầu đã đặt ra hay không?

- Filter: dùng để lọc các dữ liệu đưa vào không phù hợp với yêu cầu và trả về một kết quả đúng với yêu cầu.

Sử dụng hàm filter_var($variable, $filter, $options) để kiểm tra biến $variable với các điều kiện đưa vào, biến $filter thường mang các giá trị:

- FILTER_VALIDATE_BOOLEAN
- FILTER_VALIDATE_EMAIL
- FILTER_VALIDATE_FLOAT
- FILTER_VALIDATE_IP
- FILTER_VALIDATE_URL

Ví dụ,

$x = 'a.gmail.com';

  if(filter_var($x, FILTER_VALIDATE_EMAIL)){
    echo 'là email';
  }else {
    echo 'không là email';
}

Ví dụ, kiểm tra là số nguyên, và có giá trị nằm trong một miền giá trị.

<?php
  $x = 11;

  $int_options = array('options' => array('min_range' => 4, 'max_range' => 10));
  if(filter_var($x, FILTER_VALIDATE_INT, $int_options)){
    echo 'thỏa điều kiện';
  }else {
    echo 'không thỏa điều kiện';
  }
?>

Để tự định nghĩa và gọi hàm trong PHP filter, sử dụng cú pháp sau:
filter_var($variable, $FILTER_CALLBACK, array(‘options’ => ‘myFunc’));

Trong đó, myFunc là hàm tự định nghĩa.

Ví dụ, chức năng filter,

<?php
  $variable = 'Nguyen Van Teo';

  function convertString($string) {
    $string = str_replace(' ', '_', $string);
    return $string;
  }

  echo filter_var($variable, FILTER_CALLBACK, array('options' => 'convertString'));
?>

Ví dụ, chức năng validate,

<?php
  $number = 3;

  function checkNumber($number) {
    $flag = false;
    if($number % 2 == 0) {
      $flag = true;
    }
    return $flag;
  }

  if (filter_var($number, FILTER_CALLBACK, array('options' => 'checkNumber'))) {
    echo 'là số chẵn';
  }else {
    echo 'là số lẻ';
  }
?>

Đây là clip số 97:


Sử dụng hàm filter_var($variable, FILTER_VALIDATE_REGEXP, $options) kết hợp với biểu thức chính quy.

Ví dụ, kiểm tra số điện thoại,

<?php
  $value = '084-05-12.345678';
  $options = array(
              'options' => array('regexp' => '#^084-[0-9]{2}-[0-9]{2}\.[0-9]{6}$#')
            );
  if (filter_var($value, FILTER_VALIDATE_REGEXP, $options)) {
    echo $value.' thỏa mãn';
  }else {
    echo $value.' chưa thỏa mãn';
  }
?>

Đoạn mã kiểm tra phần mở rộng của một tập tin,

<?php
  $value = 'teo.png';
  $options = array(
              'options' => array('regexp' => '#\.(jpg|png|gif)$#')
            );
  if (filter_var($value, FILTER_VALIDATE_REGEXP, $options)) {
    echo $value.' thỏa mãn';
  }else {
    echo $value.' chưa thỏa mãn';
  }
?>

Đoạn mã sau dùng để kiểm tra giá trị nhập vào chỉ chứa chữ và số,

<?php
  $value = 'teopng';
  $options = array(
              'options' => array('regexp' => '#^[a-zA-Z0-9]+$#')
            );
  if (filter_var($value, FILTER_VALIDATE_REGEXP, $options)) {
    echo $value.' thỏa mãn';
  }else {
    echo $value.' chưa thỏa mãn';
  }
?>

Sử dụng hàm filter_var_array() để kiểm tra, lọc cùng lúc nhiều giá trị, ví dụ,

<?php
  $data = array(
                  'name'  => 'nguyen van teo',
                  'age'   => '13',
                  'email' => 'nvt@gmail.com'
            );
  $filters = array(
                  'name' => array(
                                  'filter' => FILTER_CALLBACK,
                                  'options' => 'ucwords'
                              ),
                  'age' => array(
                                  'filter' => FILTER_VALIDATE_INT,
                                  'options' => array('min_range' => 1, 'max_range' => 100)
                              ),
                  'email' => array(
                                  'filter' => FILTER_VALIDATE_EMAIL
                              ),
              );
  $result = filter_var_array($data, $filters);
  echo '<pre>';
  print_r($result);
  echo '</pre>';
?>

Hàm filter_input(input_type, variable, filter, options) được sử dụng để kiểm tra các giá trị từ FORM. Chức năng này cũng có thể lấy được dữ liệu từ các trường hợp khác như $_GET, $_POST, $_COOKIE, $_ENV, $_SERVER.

- input_type: kiểu lấy dữ liệu (INPUT_GET, INPUT_POST, INPUT_COOKIE,…)

- variable: tên của phần tử muốn lấy dữ liệu

- filter: kiểu filter

- options: mảng tham số.

Ví dụ,

[index.php]

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Filter</title>
</head>
<body>
<form action="filter.php" method="post" name="mainForm">
  <input type="text" name="email">
  <input type="submit" value="Submit">
</form>
</body>
</html>

[filter.php]

<?php
            echo '<pre>';
            print_r($_POST);
            echo '</pre>';
            if(!filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL)) {
                        echo 'Email không hợp lệ';
            }else {
                        echo 'Email hợp lệ';
            }
?>

Hàm filter_input_array() cho phép validate và filter cùng lúc trên nhiều giá trị.

Ví dụ,

[index.php]

<form action="filter.php" method="post" name="mainForm">
  Email:<input type="text" name="email">
  Age:<input type="text" name="age">
  Name:<input type="text" name="name">
  <input type="submit" value="Submit">
</form>

[filter.php]

<?php
            $filters = array(
                                                            'name' => array(
                                  'filter' => FILTER_CALLBACK,
                                  'options' => 'ucwords'
                              ),
                        'age' => array(
                                  'filter' => FILTER_VALIDATE_INT,
                                  'options' => array('min_range' => 1, 'max_range' => 100)
                              ),
                        'email' => array(
                                  'filter' => FILTER_VALIDATE_EMAIL
                              ),

                                                );
            $result = filter_input_array(INPUT_POST, $filters);
            echo '<pre>';
            print_r($result);
            echo '</pre>';

?>
-----------
Cập nhật [16/9/2020]
-----------
Xem thêm:

Ngu ngơ học làm web (84) - Bài tập upload tập tin

Tiếp theo của: Ngu ngơ học làm web (83) - Upload tập tin
-----

Phần 84.       Bài tập upload tập tin


Đây là clip số 94:


Tạo ứng dụng upload tập tin, với các yêu cầu:

- Chỉ cho upload các tập tin có kích thước từ 100 KB tới 5MB

- Chỉ cho upload các tập tin có phần mở rộng là: jpg, png, zip, mp3

- Đọc tập tin cấu hình config.ini để lấy các giá trị cần thiết

[index.php]

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>PHP</title>
</head>
<body>
<?php
  require_once 'functions.php';
  $error = '';
  $configs = parse_ini_file('config.ini');

  if (isset($_FILES['fileUpload'])) {
    $fileUpload = $_FILES['fileUpload'];
    $flagSize = checkFileSize($fileUpload['size'], $configs['min_size'], $configs['max_size']);
    $flagExt = checkFileExtension($fileUpload['name'], explode('|', $configs['extension']));
    if ($fileUpload['name'] != null && $flagSize && $flagExt) {
      $fileNameTmp = $fileUpload['tmp_name'];
      $random = randomString(5);
      $destination = './files/' . $random . '_' . $fileUpload['name'];
      if (move_uploaded_file($fileNameTmp, $destination)) {
        echo 'upload succeeded!';
      } else {
        echo 'upload failed!';
      }
    }
    if ($flagSize == false) {
      $error = 'Upload không thành công, vui lòng upload tập tin từ 100KB tới 5MB và có phần mở rộng là jpg, png, zip, mp3';
    }
    if ($flagExt == false) {
     $error = 'Upload không thành công, vui lòng upload tập tin từ 100KB tới 5MB và có phần mở rộng là jpg, png, zip, mp3';
    }
  }
 
?>
  <form action="#" method="post" enctype="multipart/form-data">
    <input type="file" name="fileUpload">
    <input type="submit" value="Submit">
    <?php
      echo '<p style="color:red">' . $error . '</p>';
    ?>
  </form>
</body>
</html>

[functions.php]

<?php
// check file size
  function checkFileSize($size, $min, $max) {
    $flag = false;
    if ($size >= $min && $size <= $max) { $flag = true; }
    return $flag;
  }
  // check file extension
  function checkFileExtension($fileName, $arrExtension) {
    $ext = pathinfo($fileName, PATHINFO_EXTENSION);
    $flag = false;
    if (in_array(strtolower($ext), $arrExtension) == true) { $flag = true; }
    return $flag;
  }

  // tạo tên tập tin ngẫu nhiên
  function randomString($length = 5) {
    // tạo ra một mảng gồm các kí tự AZaz09
    $arrChar = array_merge(range('A', 'Z'), range('a', 'z'), range('0', '9'));
    // chuyển mảng thành chuỗi
    $chars = implode($arrChar, '');
    // đảo chuỗi ngẫu nhiên
    $chars = str_shuffle($chars);
    $result = substr($chars, 0, 5);
    return $result;
  }
?>
[config.ini]
; Extension
extension = "jpg|png|mp3|zip"

; Size
min_size = 102400
max_size = 5242880

Đây là clip số 95:


Tải lên server nhiều tập tin với các yêu cầu:

- Chỉ cho tải lên các tập tin có kích thước từ 100 KB tới 5MB

- Chỉ cho tải lên các tập tin có phần mở rộng là: jpg, png, zip, mp3

- Đọc tập tin cấu hình config.ini để lấy các giá trị cần thiết

Thay đổi trong [index.php] như sau:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>PHP</title>
</head>
<body>
<?php
  require_once 'functions.php';
  $configs = parse_ini_file('config.ini');

  if (isset($_FILES['fileUpload'])) {
    $fileUpload = $_FILES['fileUpload'];
    foreach ($fileUpload['name'] as $key => $value) {
      $flagSize = checkFileSize($fileUpload['size'][$key], $configs['min_size'], $configs['max_size']);
      $flagExt = checkFileExtension($fileUpload['name'][$key], explode('|', $configs['extension']));
      if ($fileUpload['name'] != null && $flagSize && $flagExt) {
        $fileNameTmp = $fileUpload['tmp_name'][$key];
        $random = randomString(5);
        $destination = './files/' . $random . '_' . $fileUpload['name'][$key];
        if (move_uploaded_file($fileNameTmp, $destination)) {
          echo 'upload succeeded!';
        } else {
          echo 'upload failed!';
        }
      }
    }
  }
 
?>
  <form action="#" method="post" enctype="multipart/form-data">
    <input type="file" name="fileUpload[]">
    <input type="file" name="fileUpload[]">
    <input type="file" name="fileUpload[]">
    <input type="submit" value="Submit">
  </form>
</body>
</html>

Có thể sử dụng thuộc tính “multiple” của input[type=“file”] để cho phép nhập nhiều tập tin cho một input, tuy nhiên cần cân nhắc vì không phải mọi trình duyệt đều hỗ trợ.

<form action="#" method="post" enctype="multipart/form-data">
    <input type="file" name="fileUpload[]" multiple>
    <input type="submit" value="Submit">

  </form>
-----------
Cập nhật [16/9/2020]
-----------
Xem thêm:

Ngu ngơ học làm web (83) - Upload tập tin

Tiếp theo của: Ngu ngơ học làm web (82) - Kỹ thuật đệ quy 2
-----

Phần 83.       Upload tập tin


Đây là clip số 93:


Để tải một tập tin từ máy người dùng lên server (upload) cần thực hiện các bước sau:

- Chuẩn bị tập tin để tải lên

- Tạo một form bằng HTML, thẻ <form> phải có thuộc tính [enctype=“multipart/form-data”]

- Form phải có một input với [type=“file”][name=“fileUpload”]

- Sau khi bấm nút Submit, sẽ kiểm tra biến $_FILE[‘fileUpload’] trên server để có được các thông tin của tập tin đã được tải lên

- Sau khi bấm nút Submit, phần nội dung của tập tin cũng được gửi lên server

- Tại server:

+ Tập tin được lưu vào bộ nhớ tạm, với tên là *.tmp

+ Di chuyển tập tin tạm vào thư mục mong muốn

+ Đổi tên tập tin tạm thành tên mới như mong muốn

Các thông tin có trong biến $_FILE[‘fileUpload’]:

- $_FILE[‘fileUpload’][‘name’]: tên ban đầu của tập tin được tải lên server

- $_FILE[‘fileUpload’][‘size’]: kích thước của tập tin

- $_FILE[‘fileUpload’][‘type’]: kiểu của tập tin

- $_FILE[‘fileUpload’][‘tmp_name’]: tên tập tin tạm, chứa nội dung của tập tin được tải lên server (tuy nhiên sau khi submit, tìm kiếm thử tập tin này trên server thì không thấy, lý do: tập tin này bị xóa ngay khi đoạn mã về upload tập tin thực hiện xong?).

- $_FILE[‘fileUpload’][‘error’]: thông báo lỗi khi tải tập tin

Đoạn mã ví dụ:

[index.php]

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>PHP</title>
</head>
<body>
<?php
  if (isset($_FILES['fileUpload'])) {
    $fileUpload = $_FILES['fileUpload'];
    if ($fileUpload['name'] != null) {
      $fileNameTmp = $fileUpload['tmp_name'];
      $destination = './files/' . $fileUpload['name'];
      if (move_uploaded_file($fileNameTmp, $destination)) {
        echo 'upload succeeded!';
      } else {
        echo 'upload failed!';
      }
    }
  }
 
?>
  <form action="#" method="post" enctype="multipart/form-data">
    <input type="file" name="fileUpload">
    <input type="submit" value="Submit">
  </form>
</body>
</html>

Thực hiện upload tập tin với tên mới để tránh tình trạng ghi đè.

[index.php]

Sửa lại đoạn mã như sau:

  // tạo tên tập tin ngẫu nhiên
  function randomString($length = 5) {
    // tạo ra một mảng gồm các kí tự AZaz09
    $arrChar = array_merge(range('A', 'Z'), range('a', 'z'), range('0', '9'));
    // chuyển mảng thành chuỗi
    $chars = implode($arrChar, '');
    // đảo chuỗi ngẫu nhiên
    $chars = str_shuffle($chars);
    $result = substr($chars, 0, 5);
    return $result;
  }

  if (isset($_FILES['fileUpload'])) {
    $fileUpload = $_FILES['fileUpload'];
    if ($fileUpload['name'] != null) {
      $fileNameTmp = $fileUpload['tmp_name'];
      $random = randomString(5);
      $destination = './files/' . $random . '_' . $fileUpload['name'];
      if (move_uploaded_file($fileNameTmp, $destination)) {
        echo 'upload succeeded!';
      } else {
        echo 'upload failed!';
      }
    }

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

Ngu ngơ học làm web (82) - Kỹ thuật đệ quy 2

Tiếp theo của: Ngu ngơ học làm web (81) - Kỹ thuật đệ quy 1
-----

Phần 82.       Kĩ thuật đệ quy 2


Đây là clip số 90:


Hiển thị menu đa cấp trong selectbox:

[index.php]

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>PHP</title>
  <link rel="stylesheet" href="style.css">
  <script src="js/jquery.js"></script>
</head>
<body>
<?php
  $menu = array();
  $menu[] = array('id' => 1, 'name' => 'Home', 'parent' => 0);
  $menu[] = array('id' => 2, 'name' => 'About', 'parent' => 0);
  $menu[] = array('id' => 3, 'name' => 'News', 'parent' => 0);
  $menu[] = array('id' => 4, 'name' => 'Products', 'parent' => 0);
  $menu[] = array('id' => 5, 'name' => 'Contact', 'parent' => 0);
  $menu[] = array('id' => 6, 'name' => 'Tin trong nước', 'parent' => 3);
  $menu[] = array('id' => 7, 'name' => 'Tin quốc tế', 'parent' => 3);
  $menu[] = array('id' => 8, 'name' => 'Công nghệ', 'parent' => 6);
  $menu[] = array('id' => 9, 'name' => 'Giáo dục', 'parent' => 6);
  $menu[] = array('id' => 10, 'name' => 'Y tế', 'parent' => 6);
  $menu[] = array('id' => 11, 'name' => 'Education', 'parent' => 7);
  $menu[] = array('id' => 12, 'name' => 'Breaking news', 'parent' => 7);
  $menu[] = array('id' => 13, 'name' => 'Software', 'parent' => 4);

  function deQuyLevel($array, $parent, $level, &$newArray) {
    // điều kiện dừng
    if (count($array) > 0) {
      foreach ($array as $key => $value) {
        if ($value['parent'] == $parent) {
          $value['level'] = $level;
          $newArray[] = $value;
          unset($array[$key]);
          $newParent = $value['id'];
          deQuyLevel($array, $newParent, $level + 1, $newArray);
        }
      }
    }
  }
  $menu1 = array();
  deQuyLevel($menu, 0, 1, $menu1);

function createSelectbox ($array, $selected = 0, $name, $style = null, $size = 0) {
  $xhtml = '<select name="'. $name . 'id="' . $name . '" style="' . $style . '" size="' . $size . '">';
  foreach($array as $key => $value) {
      $strSelected = '';
      if ($value['id'] == $selected) {
        $strSelected = 'selected="selected"';
      }
      if ($value['level'] == 1) {
        $xhtml .= '<option value="' . $value['id'] . '"' . $strSelected . '>+' . $value['name'] . '</option>';
      } else {
        $name = str_repeat('&nbsp;', 4 * ($value['level'] - 1)) . '-' . $value['name'];
        $xhtml .= '<option value="' . $value['id'] . '"' . $strSelected . '>' . $name . '</option>';
      }
    }
  $xhtml .= '</select>';
  return $xhtml;
}
  echo createSelectbox($menu1, 1, 'selectbox', 'min-width: 200px; padding: 3px; margin: 10px', 15);
?>
</body>
</html>

Đây là clip số 91:


Tạo menu đa cấp sử dụng ul, li.

Lưu lại mã nguồn để tham khảo.

[index.php]

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>PHP</title>
</head>
<body>
<?php
  $menu = array();
  $menu[] = array('id' => 1, 'name' => 'Home', 'parent' => 0);
  $menu[] = array('id' => 2, 'name' => 'About', 'parent' => 0);
  $menu[] = array('id' => 3, 'name' => 'News', 'parent' => 0);
  $menu[] = array('id' => 4, 'name' => 'Products', 'parent' => 0);
  $menu[] = array('id' => 5, 'name' => 'Contact', 'parent' => 0);
  $menu[] = array('id' => 6, 'name' => 'Tin trong nước', 'parent' => 3);
  $menu[] = array('id' => 7, 'name' => 'Tin quốc tế', 'parent' => 3);
  $menu[] = array('id' => 8, 'name' => 'Công nghệ', 'parent' => 6);
  $menu[] = array('id' => 9, 'name' => 'Giáo dục', 'parent' => 6);
  $menu[] = array('id' => 10, 'name' => 'Y tế', 'parent' => 6);
  $menu[] = array('id' => 11, 'name' => 'Education', 'parent' => 7);
  $menu[] = array('id' => 12, 'name' => 'Breaking news', 'parent' => 7);
  $menu[] = array('id' => 13, 'name' => 'Software', 'parent' => 4);

  function deQuyMenu($array, $parent, &$newString) {
    // điều kiện dừng
    if (count($array) > 0) {
      $newString .= '<ul>';
      foreach ($array as $key => $value) {
        if ($value['parent'] == $parent) {
          $value['name'] = '<a href="targetPage.php?targetID=' . $value['id'] . '">' . $value['name'] . '</a>';
          $newString .= '<li>' . $value['name'];
          unset($array[$key]);
          $newParent = $value['id'];
          deQuyMenu($array, $newParent, $newString);
          $newString .= '</li>';
        }
      }
      $newString .= '</ul>';
    }
  }
  deQuyMenu($menu, 0, $newString);
  $newString = str_replace('<ul></ul>', '', $newString);
  echo $newString;
?>
</body>
</html>

Đây là clip số 92:

Hiển thị nội dung thư mục bằng hàm đệ quy.


[index.php]

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>PHP</title>
</head>
<body>
<?php
  function showAll($path, &$newString){
    $data = scandir($path);
    $newString .= '<ul>';
    foreach ($data as $key => $value) {
      if ($value != '.' && $value != '..') {
        $dir = $path . '/' . $value;
        if (is_dir($dir)) {
          $newString .= '<li>'. 'D: ' . $value;
          showAll($dir, $newString);
          $newString .= '</li>';
        } else {
          $newString .= '<li>' . 'F: ' . $value . '</li>';     
        }
      }
    }
    $newString .= '</ul>';
  }
  showAll('.', $newString);
  echo $newString;
?>
</body>

</html>
-----------
Cập nhật [16/9/2020]
-----------
Xem thêm:

Ngu ngơ học làm web (81) - Kỹ thuật đệ quy 1

Tiếp theo của: Ngu ngơ học làm web (80) - Bài tập xử lý tập tin 2
-----

Phần 81.       Kĩ thuật đệ quy 1


Đây là clip số 87:


Đệ quy (recursive): là sự lặp lại chính nó.

Hàm đệ quy là hàm gọi lại chính nó, lồng nhau liên tục, cho tới khi gặp điều kiện dừng.

function myFunction ($param1, $param2) {
    if ($param1 == $param2) { // điều kiện dừng hàm
      // trả về giá trị - kết thúc hàm
    } else {
      // gọi lại hàm myFunction ($param1, $param2)
    }
  }

Ví dụ, viết hàm tính n!

Với cách viết thông thường:

function giaiThua($n) {
    $result = 1;
    if ($n == 0 || $n == 1) {
      return $result;
    } else {
      for ($i = 2; $i <= $n; $i++) {
        $result = $result * $i;
      }
      return $result;
    }
  }

Viết lại theo kiểu đệ quy:

  function giaiThua($n) {
    $result = 1;
    if ($n == 0 || $n == 1) {
      return $result;
    } else {
      $result = $n * giaiThua($n - 1);
    }
    return $result;
  }

Hàm tính tổng từ 0 đến n, viết theo kiểu đệ quy:

  function tinhTong($n) {
    $result = 0;
    if ($n == 0) {
      return 0;
    } else {
      $result = $n + tinhTong($n -1);
    }
    return $result;
  }

Đây là clip số 88:


Sử dụng hàm đệ quy để tạo menu đa cấp.

Cho một menu đa cấp, lưu dưới dạng mảng như sau:

  $menu = array();
  $menu[] = array('id' => 1, 'name' => 'Home', 'parent' => 0);
  $menu[] = array('id' => 2, 'name' => 'About', 'parent' => 0);
  $menu[] = array('id' => 3, 'name' => 'News', 'parent' => 0);
  $menu[] = array('id' => 4, 'name' => 'Products', 'parent' => 0);
  $menu[] = array('id' => 5, 'name' => 'Contact', 'parent' => 0);
  $menu[] = array('id' => 6, 'name' => 'Tin trong nước', 'parent' => 3);
  $menu[] = array('id' => 7, 'name' => 'Tin quốc tế', 'parent' => 3);
  $menu[] = array('id' => 8, 'name' => 'Công nghệ', 'parent' => 6);
  $menu[] = array('id' => 9, 'name' => 'Giáo dục', 'parent' => 6);
  $menu[] = array('id' => 10, 'name' => 'Y tế', 'parent' => 6);
  $menu[] = array('id' => 11, 'name' => 'Education', 'parent' => 7);
  $menu[] = array('id' => 12, 'name' => 'Breaking news', 'parent' => 7);
  $menu[] = array('id' => 13, 'name' => 'Software', 'parent' => 4);

Mảng $menu gồm 13 phần tử, mỗi phần tử chứa ba thông tin, một là “id”, hai là “name” và ba là “id của menu mức cha nó”.

Việc tiếp theo là thêm thông tin về cấp của menu vào mỗi phần tử của mảng, để được kết quả như sau:

  $menu1 = array();
  $menu1[] = array('id' => 1, 'name' => 'Home', 'parents' => 0, 'level' => 1);
  $menu1[] = array('id' => 2, 'name' => 'About', 'parents' => 0, 'level' => 1);
  $menu1[] = array('id' => 3, 'name' => 'News', 'parents' => 0, 'level' => 1);
  $menu1[] = array('id' => 4, 'name' => 'Products', 'parents' => 0, 'level' => 1);
  $menu1[] = array('id' => 5, 'name' => 'Contact', 'parents' => 0, 'level' => 1);
  $menu1[] = array('id' => 6, 'name' => 'Tin trong nước', 'parents' => 3, 'level' => 2);
  $menu1[] = array('id' => 7, 'name' => 'Tin quốc tế', 'parents' => 3, 'level' => 2);
  $menu1[] = array('id' => 8, 'name' => 'Công nghệ', 'parents' => 6, 'level' => 3);
  $menu1[] = array('id' => 9, 'name' => 'Giáo dục', 'parents' => 6, 'level' => 3);
  $menu1[] = array('id' => 10, 'name' => 'Y tế', 'parents' => 6, 'level' => 3);
  $menu1[] = array('id' => 11, 'name' => 'Education', 'parents' => 7, 'level' => 3);
  $menu1[] = array('id' => 12, 'name' => 'Breaking news', 'parents' => 7, 'level' => 3);
  $menu1[] = array('id' => 13, 'name' => 'Software', 'parents' => 4, 'level' => 2);

Sau đó, sắp xếp lại mảng để các phần từ có mối liên hệ cha-con thì đặt cạnh nhau:

  $menu1 = array();
  $menu1[] = array('id' => 1, 'name' => 'Home', 'parent' => 0, 'level' => 1);
  $menu1[] = array('id' => 2, 'name' => 'About', 'parent' => 0, 'level' => 1);
  $menu1[] = array('id' => 3, 'name' => 'News', 'parent' => 0, 'level' => 1);
  $menu1[] = array('id' => 6, 'name' => 'Tin trong nước', 'parent' => 3, 'level' => 2);
  $menu1[] = array('id' => 8, 'name' => 'Công nghệ', 'parent' => 6, 'level' => 3);
  $menu1[] = array('id' => 9, 'name' => 'Giáo dục', 'parent' => 6, 'level' => 3);
  $menu1[] = array('id' => 10, 'name' => 'Y tế', 'parent' => 6, 'level' => 3);
  $menu1[] = array('id' => 7, 'name' => 'Tin quốc tế', 'parent' => 3, 'level' => 2);
  $menu1[] = array('id' => 11, 'name' => 'Education', 'parent' => 7, 'level' => 3);
  $menu1[] = array('id' => 12, 'name' => 'Breaking news', 'parent' => 7, 'level' => 3);
  $menu1[] = array('id' => 4, 'name' => 'Products', 'parent' => 0, 'level' => 1);
  $menu1[] = array('id' => 13, 'name' => 'Software', 'parent' => 4, 'level' => 2);
  $menu1[] = array('id' => 5, 'name' => 'Contact', 'parent' => 0, 'level' => 1);

Đây là clip số 89:


Đoạn mã thực hiện yêu cầu ở trên (không dùng kĩ thuật đệ quy):

  foreach ($menu as $key => $value) {
    if ($value['parent'] == 0) {
      $value['level'] = 1;
      $menu1[] = $value;
      unset($menu[$key]);

      $parent = $value['id'];
      foreach ($menu as $key1 => $value1) {
        if ($value1['parent'] == $parent) {
          $value1['level'] = $value['level'] + 1;
          $menu1[] = $value1;
          unset($menu[$key1]);

          $parent1 = $value1['id'];
          foreach ($menu as $key2 => $value2) {
            if ($value2['parent'] == $parent1) {
              $value2['level'] = $value1['level'] + 1;
              $menu1[] = $value2;
              unset($menu[$key2]);
            }
          }
        }
      }
    }
  }

// xuất menu
  foreach ($menu1 as $key => $value) {
    if ($value['level'] == 1) {
      echo '<div style="border: 1px solid #ccc;">+' . $value['name'] . '</div>';
    } else {
      $padding = ($value['level'] - 1) * 20;
      $padding = 'padding-left:' . $padding . 'px';
      echo '<div style="border: 1px solid #ccc;'. $padding . '">-' . $value['name'] . '</div>';
    }
  }

Viết lại đoạn mã ở trên (có dùng kĩ thuật đệ quy):

function deQuyLevel($array, $parent, $level, &$newArray) {
    // điều kiện dừng
    if (count($array) > 0) {
      foreach ($array as $key => $value) {
        if ($value['parent'] == $parent) {
          $value['level'] = $level;
          $newArray[] = $value;
          unset($array[$key]);
          $newParent = $value['id'];
          deQuyLevel($array, $newParent, $level + 1, $newArray);
        }
      }
    }
  }
  $menu1 = array();

  deQuyLevel($menu, 0, 1, $menu1);
-----------
Cập nhật [16/9/2020]
-----------
Xem thêm:

Tiếng Anh chuyên ngành Công nghệ Thông tin (4) - The computer (hết)

Tiếp theo của: Tiếng Anh chuyên ngành Công nghệ Thông tin (3) - The computer (tiếp)
------

1.1        Học nói – Chào hỏi bằng tiếng Anh

1.1.1        Một vài gợi ý để học nói

– Kỹ năng nghe và nói luôn luôn song hành với nhau, nên học hai cái cùng nhau

– Mạnh dạn gặp gỡ và nói chuyện

– Luôn tôn trọng, và chân thành với mọi người

– Luôn quan sát tình huống, quan sát người khác để học hỏi qua các buổi gặp gỡ, làm việc

– Nhờ đối tác chỉ lại cho mình

1.1.2        Một số câu dùng để chào hỏi

 Tiếng Anh

Nghĩa

Đáp lại

Hello, hello there

Xin chào

 

Hi, Hi all, Hi everyone, Hey,

Chào (thân mật)

 

Good morning

Chào buổi sáng

 

Good afternoon

Chào buổi chiều (sau 12 giờ trưa tới trước khi trời tối, khoảng 5 giờ chiều)

 

Good evening

Chào buổi tối (từ khi trời tối tới khuya, khoảng sau 5 giờ chiều tới khuya)

 

Nice to meet you

Rất vui được gặp bạn

 

Nice to meet you here

Rất vui được gặp bạn ở đây

 

Happy to meet you again

Rất vui được gặp lại bạn

 

It’s good to see you

Thật tốt khi được gặp bạn

 

Long time no see

Lâu rồi không gặp (thân mật)

 

How’s it going?

Dạo này sao rồi?

 

It’s a pleasure to meet you

Hân hạnh được gặp bạn

 

What have you been up to?

Dạo này bạn như thế nào?

 

How are you?

Bạn khỏe  không?

 

How are you doing?

Bạn dạo này thế nào?

I’m doing well. I’m doing great. I’m happy. How about you.

Not so good. Not so well.

How are you today?

Hôm nay bạn thế nào?

 

Thanks for agreeing to meet with me

Cám ơn vì đã đồng ý gặp tôi

 

Xem: https://www.youtube.com/watch?v=0oJzdvnfHQc

Xem: https://www.youtube.com/watch?v=LhXN2X6wF1Q

Xem thêm: https://www.youtube.com/watch?v=u8yX9lhhYBM

Đọc thêm: https://www.fluentu.com/blog/english/english-greetings-expressions/

1.1.3        Bài tập

Bài tập 1. Tìm các câu đáp lại cho mỗi câu chào ở bảng trên.

1.2        Học nghe

1.2.1        Gợi ý các bước để học nghe

Với mỗi bài nghe:

– Nghe qua từ đầu đến cuối để làm quen (chưa cần hiểu nội dung của cả bài)

– Nghe để hiểu nội dung (vừa nghe vừa dõi theo văn bản–transcript đi kèm), dùng từ điển để tra nghĩa các từ mới, có thể viết lại nội dung của từng câu ra giấy

– Nghe và cảm nhận (nghe mà không cần transcript), nghe tới đâu hiểu tới đó

– Có thể thực hiện lại mỗi bước ở trên (nếu cần) cho tới khi nào bạn nghe mà hiểu được toàn bộ nội dung của bài

1.2.2        Bài tập

Bài tập 1: Dùng từ điển đọc 10 từ trong bài đọc hiểu, ghi lại các từ bạn đã nghe được.

Bài tập 2: New mobile computing devices

https://www.youtube.com/watch?v=lKTIHkDvaF4

Nghe/hoặc đọc rồi điền từ vào chỗ trống:

Search                        Partnership                Divices            Versions                     Generation                 Product            Industry         Digital             Tablet             Operating Sytem

From VOA Learning English, this is the Technology Report in Special English.

Competition in the field of mobile computing (1) ……… is increasing faster than ever. In September, many (2) ……… leaders announced new products to a market already crowded with choices. The announcements come as people start to think about the holiday gift-giving season.

Nokia and Microsoft introduced two new smartphones at a joint announcement in New York. The new devices can be charged wirelessly and have improved cameras. But they also run on the new Microsoft Windows 8 operating system. The (3)………. with Microsoft is very important to Nokia.

Nokia's chief executive told people attending the (4)……… announcement that "Nokia needed to be part of an ecosystem."

An ecosystem is the mix of software, hardware and (5)………. networks that make mobile computing devices useful. Apple has built its own operating system, which includes the cloud computing system. And Google has its Android (6)……….. So far, Apple and Google have built powerful market positions with popular smartphone and computer devices.

In May, the Internet (7)………. leader Google bought Motorola, a technology manufacturer. That led to new smartphones that run on the faster, fourth (8)………., or 4-G, high-speed communications network.

Microsoft hopes to gain market share with Windows 8, a new operating system. Windows 8 will be available in (9)………. for personal computers, smartphones and tablet computers.

Through the fall, market watchers are expecting new mobile computing devices to appear in stores. They include a new Kindle eReader and a new (10)……… computer from Microsoft.

Bài tập 3: Xem clip, học nói, nghe và ghi lại đoạn nghe ra giấy.

https://www.youtube.com/watch?v=akXGSw7H49Y

1.3        Tập viết

Các bước để viết một email đơn giản (theo web5ngay):

– Bước 1: Soạn email bằng tiếng Việt

– Bước 2: Dịch sẵn một số từ quan trọng

– Bước 3: Dùng Google translate dịch sang tiếng Anh

– Bước 4: Sử dụng website để kiểm tra lại ngữ pháp

– Bước 5: Viết lại ra giấy, email bằng tiếng Anh để học, để nhớ.

Xem thêm: https://www.youtube.com/watch?v=HzBxBtk6XB4

Ví dụ: viết email xin đi thực tập tại một công ty phần mềm.

Xin chào anh Teo Nguyen,

Em tên là Mit Le, sinh viên năm 4, chuyên ngành công nghệ phần mềm, khoa CNTT, đại học ABC.

Theo chương trình đào tạo, em sẽ đi thực tập tại một công ty vào học kỳ thứ 8.

Thời gian thực tập (dự kiến) bắt đầu vào tháng 9/2021 và kết thúc vào tháng 12/2021.

Em đã tìm hiểu về công ty, và thấy rất phù hợp với chuyên ngành em đang theo đuổi.

Lĩnh vực chuyên môn của em là web, các ngôn ngữ, công nghệ và các dự án em đã làm được ghi chi tiết trong CV em gửi kèm trong email này.

Rất mong nhận được hồi âm từ anh.

Trân trọng.

Mit Le.

Email: mitle@gmail.com

Phone: 0123456789

-------------

Đáp án

Bài tập 1. circuit, certain, signal, instruction, with, switch, data, date, day, tape

Bài tập 2. (1) devices, (2) industry, (3) partnership, (4) product,  (5) digital, (6) Operating  system, (7) search, (8) generation, (9) version, (10) tablet

[Email xin thực tập]

Bước 1: Soạn email bằng tiếng Việt

Xin chào anh Teo Nguyen,

Em tên là Mit Le, sinh viên năm 4, chuyên ngành công nghệ phần mềm, khoa CNTT, đại học ABC.

Theo chương trình đào tạo, em sẽ đi thực tập tại một công ty vào học kỳ thứ 8.

Thời gian thực tập (dự kiến) bắt đầu vào tháng 9/2021 và kết thúc vào tháng 12/2021.

Em đã tìm hiểu về công ty, và thấy rất phù hợp với chuyên ngành em đang theo đuổi.

Lĩnh vực chuyên môn của em là web, các ngôn ngữ, công nghệ và các dự án em đã làm được ghi chi tiết trong CV em gửi kèm trong email này.

Rất mong nhận được hồi âm từ anh.

Trân trọng.

Mit Le.

Email: mitle@gmail.com

Phone: 0123456789

Bước 2: Dịch các từ quan trọng

Xin chào anh Teo Nguyen,

Em tên là Mit Le, sinh viên năm 4, majoring in software engineering, khoa CNTT, đại học ABC.

Theo education program, em sẽ đi internship tại một công ty vào học kỳ thứ 8.

Internship duration (expected) bắt đầu vào tháng 9/2021 và kết thúc vào tháng 12/2021.

Em đã tìm hiểu về công ty, và thấy rất phù hợp với major em đang theo đuổi.

Lĩnh vực chuyên môn của em là web, các ngôn ngữ, công nghệ và các dự án em đã làm được ghi chi tiết trong CV em gửi kèm trong email này.

Rất mong nhận được hồi âm từ anh.

Trân trọng.

Mit Le.

Email: mitle@gmail.com

Phone: 0123456789

Bước 3: Dịch toàn bộ email sang tiếng Anh bằng Google translate

Hello Mr. Teo Nguyen,

My name is Mit Le, a 4th year student, majoring in software engineering, IT department, ABC University.

Under the education program, I will do an internship at a company in the 8th semester.

Internship duration (expected) starts in September 2021 and ends in December 2021.

I have researched about the company, and found it very suitable for the major I am pursuing.

My area of expertise is web, languages, technology and projects I have worked on are detailed in my CV attached in this email.

Looking forward to hearing from you.

Best regards.

Mit Le.

Bước 4: Kiểm tra ngữ pháp bằng website https://app.grammarly.com/

Ví dụ,



Sửa các lỗi theo gợi ý ở cửa sổ bên phải.

Bước 5: Đã được email hoàn thiện. Bạn nên viết lại email ra giấy để nhớ, và hình thành kĩ năng viết về sau. Sau này sẽ tự viết email mà không cần (hoặc rất ít) phải dùng tới sự hỗ trợ của các công cụ.

Lưu ý: Khi viết email, sẽ dùng chữ Dear (nghĩa là thưa, kính chào, mang nghĩa trân trọng) để thay chữ “Hello”. Nếu email cho người quen, bạn thân thì có thể chào là “Hi”.

Dear Mr. Teo Nguyen,

My name is Mit Le, a 4th-year student, majoring in software engineering, IT department, ABC University.

Under the education program, I will do an internship at a company in the 8th semester.

The internship duration (expected) starts in September 2021 and ends in December 2021.

I have researched about the company and found it very suitable for the major I am pursuing.

My area of expertise is web, languages, technology, and projects I have worked on are detailed in my CV attached to this email.

Looking forward to hearing from you.

Best regards.

Mit Le.

------
Video: https://www.youtube.com/watch?v=wF3_E0fSRsg&t=50s
------
Cập nhật [28/8/2021]
-----------
Xem thêm:
Tiếng Anh chuyên ngành Công nghệ Thông tin (0) - Danh mục các bài học
Tiếng Anh chuyên ngành Công nghệ Thông tin (5) -