Vòng lặp Foreach nâng cao trong PHP

02/05/2020 - lượt xem
Chia sẻ
 
Rate this post

Hôm nay mình giới thiệu tới các bạn một số phần nâng cao hơn với vòng lặp foreach trong PHP. Việc áp dụng các phần kiến thức này có thể giúp chúng ta cải thiện mã nguồn của mình gọn gàng hơn.

Xem thêm vòng lặp trong PHP để xem thêm kiến thức về vòng lặp.

Vòng lặp foreach lồng nhau trong PHP

Khi lập trình PHP sẽ không thiếu trường hợp cần phải xử lý vòng lặp lồng nhau như dưới đây

<?php
$array = [
    [1, 2],
    [3, 4],
];
foreach($array as $items){
    foreach($items as $item){
        echo $item.PHP_EOL;
    }
}

Kết quả

1
2
3
4

Tuy nhiên chúng ta có 1 cách khác để loại bỏ vòng lặp lồng nhau như thế này bằng cách sử dụng list() trong PHP

<?php
$array = [
    [1, 2],
    [3, 4],
];

foreach ($array as list($a, $b)) {
    echo $a.PHP_EOL;
    echo $b.PHP_EOL;
}

Lưu ý: Cách dùng list chỉ áp dụng cho phiên bản PHP 5.5 trở lên

Xem thêm những cải tiến từ PHP 5 đến PHP 8

Vòng lặp Foreach tham chiếu

Mục đích có thể sửa phần tử trong mảng truyền vào

Ví dụ với một mảng [1,2,3,4] chúng ta muốn tạo ra 1 mảng mà các phần tử đều nhân lên với 2. Chúng ta có 2 cách như sau

Cách 1: Cứ bình thường mà làm thôi

<?php
$result = []; // sử dụng từ phiên bản PHP 5.4 trước 5.4 sửa dụng khai báo $result = array();
foreach($array as $item){
    array_push($result,$item*2); // hoặc $result[] = $item*2;
}
var_dump($result);

Kết quả

array(4) {
  [0]=>
  int(2)
  [1]=>
  int(4)
  [2]=>
  int(6)
  [3]=>
  int(8)
}

Cách 2 sử dụng tham chiếu

<?php
$array = array(1, 2, 3, 4);

foreach ($array as &$value) {
    $value = $value * 2;
}
unset($value);
var_dump($array);
array(4) {
  [0]=>
  int(2)
  [1]=>
  int(4)
  [2]=>
  int(6)
  [3]=>
  int(8)
}

Việc sử dụng vòng For kiểu tham chiếu có một lỗi dễ bị các bạn mới lập trình mắc phải chính là chỗ unset trong đoạn mã trên. Mặc dù vòng lặp Foreach đã kết thúc tuy vậy biến tham chiếu $value không bị hủy đi mà vẫn tồn tại. Việc này có thể ảnh hưởng tới logic chạy của đoạn mã nguồn

Xem ví dụ dưới đây để hiểu rõ hơn

Việc quên unset $value dẫn đến phần tử thứ 3 của mảng bị thay đổi giá trị theo mặc dù vòng foreach đã kết thúc

<?php
$array = array(1, 2, 3, 4);

foreach ($array as &$value) {
    $value = $value * 2;
}
//unset($value);
$value = 1000;

var_dump($array);

Kết quả

array(4) {
  [0]=>
  int(2)
  [1]=>
  int(4)
  [2]=>
  int(6)
  [3]=>
  &int(1000)
}

Lặp từng phần tử trong mảng với vòng lặp While

Vòng lặp này gần tương đương với vòng lặp Foreach

Chú ý: Hàm each() trong PHP đã bị deprecate kể từ phiên bản PHP 7.2

<?php
$array = array("Táo", "Cam", "Chuối");
while($item = each($array)){
    var_dump($item);
}

Kết quả

array(4) {
  [1]=>
  string(4) "Táo"
  ["value"]=>
  string(4) "Táo"
  [0]=>
  int(0)
  ["key"]=>
  int(0)
}
array(4) {
  [1]=>
  string(3) "Cam"
  ["value"]=>
  string(3) "Cam"
  [0]=>
  int(1)
  ["key"]=>
  int(1)
}
array(4) {
  [1]=>
  string(7) "Chuối"
  ["value"]=>
  string(7) "Chuối"
  [0]=>
  int(2)
  ["key"]=>
  int(2)
}

Trên đây mình đã giới thiệu 1 số kiến thức nâng cao hơn đối với vòng lặp Foreach, hi vọng bài viết này có thể giúp các bạn hiểu thêm phần nào về vòng lặp Foreach. Hãy để lại bình luận của bạn dưới bài viết để cùng thảo luận hoặc có bất kì thắc mắc nào nhé.

 

 

    Liên hệ với chúng tôi

    Để lại thông tin để nhận được các bài viết khác

    Rate this post

    Xem thêm nhiều bài tin mới nhất về PHP cơ bản

    Xem thêm