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é.