Cấu trúc foreach trong PHP được thiết kế đặc biệt để lặp qua các mảng. Nếu bạn cố gắng sử dụng nó trên một biến có kiểu dữ liệu khác, PHP sẽ phát sinh lỗi.
Vòng lặp foreach trong PHP có thể được sử dụng với mảng chỉ mục cũng như mảng liên kết. Có hai loại cú pháp sử dụng khác nhau −
foreach (array as $value) { statements }
Phương pháp trên hữu ích khi bạn muốn lặp qua một mảng chỉ mục. Cú pháp dưới đây phù hợp hơn cho các mảng liên kết.
foreach (array as $key => $value) { statements }
Tuy nhiên, cả hai phương pháp này đều hoạt động tốt với mảng chỉ mục, vì chỉ số của một mục trong mảng cũng đóng vai trò như một khóa.
Loại cú pháp đầu tiên ở trên cho thấy một dấu ngoặc đơn trước từ khóa foreach . Tên của mảng được duyệt sau đó được theo sau bởi từ khóa " as " và sau đó là một biến.
Khi vòng lặp đầu tiên bắt đầu, phần tử đầu tiên trong mảng được gán cho biến. Sau khi khối lặp kết thúc, biến sẽ nhận giá trị của phần tử tiếp theo và lặp lại các câu lệnh trong thân vòng lặp cho đến khi các phần tử trong mảng được xử lý hết.
Một ví dụ điển hình về vòng lặp foreach như sau −
<?php $arr = array(10, 20, 30, 40, 50); foreach ($arr as $val) { echo "$val \n"; } ?>
PHP cung cấp một hàm rất hữu ích trong array_search() mà trả về khóa của một giá trị nhất định. Vì chỉ mục chính là khóa trong một mảng chỉ mục, nên array_search() cho mỗi $val trả về chỉ mục bắt đầu từ 0 của mỗi giá trị. Đoạn mã sau đây minh họa cách nó hoạt động −
<?php $arr = array(10, 20, 30, 40, 50); foreach ($arr as $val) { $index = array_search($val, $arr); echo "Element at index $index is $val \n"; } ?>
Nó sẽ tạo ra output −
Element at index 0 is 10 Element at index 1 is 20 Element at index 2 is 30 Element at index 3 is 40 Element at index 4 is 50
Biến thể thứ hai của cú pháp foreach giải nén từng phần tử trong mảng thành hai biến: một biến cho key và một biến cho value .
Vì chỉ mục tự nó hoạt động như một khóa trong trường hợp của một mảng chỉ mục, biến $k lần lượt nhận giá trị chỉ mục tăng dần của từng phần tử trong mảng.
<?php $arr = array(10, 20, 30, 40, 50); foreach ($arr as $k=>$v) { echo "Key: $k => Val: $v \n"; } ?>
Nó sẽ tạo ra output −
Key: 0 => Val: 10 Key: 1 => Val: 20 Key: 2 => Val: 30 Key: 3 => Val: 40 Key: 4 => Val: 50
Mảng liên kết là một tập hợp các cặp khóa-giá trị. Để lặp qua một mảng liên kết, cú pháp foreach dạng thứ hai là phù hợp. Mỗi phần tử trong mảng được giải nén thành hai biến, mỗi biến nhận giá trị của khóa và giá trị tương ứng của nó.
Dưới đây là một ví dụ trong đó một mảng các tiểu bang và thủ đô tương ứng của chúng được duyệt qua bằng vòng lặp foreach .
<?php $capitals = array( "Maharashtra"=>"Mumbai", "Telangana"=>"Hyderabad", "UP"=>"Lucknow", "Tamilnadu"=>"Chennai" ); foreach ($capitals as $k=>$v) { echo "Capital of $k is $v \n"; } ?>
Nó sẽ tạo ra output −
Capital of Maharashtra is Mumbai Capital of Telangana is Hyderabad Capital of UP is Lucknow Capital of Tamilnadu is Chennai
Tuy nhiên, bạn vẫn có thể sử dụng phiên bản đầu tiên của câu lệnh foreach , trong đó chỉ giá trị từ mỗi cặp khóa-giá trị trong mảng được lưu trữ trong biến. Sau đó, chúng ta có được khóa tương ứng với giá trị bằng cách sử dụng hàm array_search() mà chúng ta đã sử dụng trước đó.
<?php $capitals = array( "Maharashtra"=>"Mumbai", "Telangana"=>"Hyderabad", "UP"=>"Lucknow", "Tamilnadu"=>"Chennai" ); foreach ($capitals as $pair) { $cap = array_search($pair, $capitals); echo "Capital of $cap is $capitals[$cap] \n"; } ?>
Có thể khai báo một mảng đa chiều trong PHP, trong đó mỗi phần tử trong mảng là một mảng khác. Lưu ý rằng cả mảng bên ngoài cũng như mảng con có thể là mảng chỉ số hoặc mảng liên kết.
Trong ví dụ dưới đây, chúng ta có một mảng hai chiều, có thể được gọi là mảng của các mảng. Chúng ta cần sử dụng vòng lặp lồng nhau để duyệt qua cấu trúc mảng lồng nhau như sau −
<?php $twoD = array( array(1,2,3,4), array("one", "two", "three", "four"), array("one"=>1, "two"=>2, "three"=>3) ); foreach ($twoD as $idx=>$arr) { echo "Array no $idx \n"; foreach ($arr as $k=>$v) { echo "$k => $v" . "\n"; } echo "\n"; } ?>
Nó sẽ tạo ra output −
Array no 0 0 => 1 1 => 2 2 => 3 3 => 4 Array no 1 0 => one 1 => two 2 => three 3 => four Array no 2 one => 1 two => 2 three => 3