Sau khi nắm vững hàm trong PHP, bước tiếp theo là học cách lưu trữ và xử lý nhiều dữ liệu cùng lúc với mảng trong PHP. Mảng giúp bạn quản lý danh sách sản phẩm, điểm số của học sinh, thông tin người dùng hay bất kỳ tập hợp dữ liệu nào mà không cần tạo hàng trăm biến riêng lẻ. Đây là kiến thức nền tảng quan trọng để làm việc với database và xây dựng ứng dụng thực tế.
1. Mảng là gì?
Mảng (Array) là một biến đặc biệt có thể lưu trữ nhiều giá trị trong một tên biến duy nhất. Thay vì tạo nhiều biến:
<?php
// ❌ Không hiệu quả
$sinh_vien_1 = "Nguyễn Văn A";
$sinh_vien_2 = "Trần Thị B";
$sinh_vien_3 = "Lê Văn C";
// ... 100 biến khác
// ✅ Dùng mảng
$sinh_vien = ["Nguyễn Văn A", "Trần Thị B", "Lê Văn C"];
?>PHP hỗ trợ 3 loại mảng chính:
- ✅ Indexed Array: Mảng chỉ số (index tự động: 0, 1, 2…)
- ✅ Associative Array: Mảng liên kết (key-value tự định nghĩa)
- ✅ Multidimensional Array: Mảng đa chiều (mảng chứa mảng)
2. Mảng chỉ số (Indexed Array)
Mảng có index số tự động bắt đầu từ 0:
<?php
// Cách 1: Cú pháp ngắn (PHP 5.4+)
$mon_hoc = ["PHP", "JavaScript", "MySQL"];
// Cách 2: Cú pháp cũ
$mon_hoc = array("PHP", "JavaScript", "MySQL");
// Truy cập phần tử
echo $mon_hoc[0]; // PHP
echo $mon_hoc[1]; // JavaScript
echo $mon_hoc[2]; // MySQL
// Số phần tử trong mảng
echo count($mon_hoc); // 3
?>2.1. Thêm phần tử vào mảng
<?php
$mang = ["A", "B", "C"];
// Thêm vào cuối
$mang[] = "D";
array_push($mang, "E", "F");
print_r($mang);
// Array ( [0] => A [1] => B [2] => C [3] => D [4] => E [5] => F )
// Thêm vào đầu
array_unshift($mang, "Z");
print_r($mang);
// Array ( [0] => Z [1] => A [2] => B ... )
?>2.2. Xóa phần tử khỏi mảng
<?php
$mang = ["A", "B", "C", "D", "E"];
// Xóa phần tử cuối
$phan_tu_cuoi = array_pop($mang);
echo $phan_tu_cuoi; // E
print_r($mang); // A, B, C, D
// Xóa phần tử đầu
$phan_tu_dau = array_shift($mang);
echo $phan_tu_dau; // A
print_r($mang); // B, C, D
// Xóa phần tử theo index
unset($mang[1]); // Xóa "C"
print_r($mang); // B, D (index không liên tục)
// Reset index
$mang = array_values($mang);
print_r($mang); // [0] => B, [1] => D
?>2.3. Duyệt mảng với vòng lặp
<?php
$diem = [7.5, 8.0, 6.5, 9.0, 8.5];
// Cách 1: For loop
for ($i = 0; $i < count($diem); $i++) {
echo "Điểm thứ " . ($i + 1) . ": " . $diem[$i] . "<br>";
}
// Cách 2: Foreach (khuyến nghị)
foreach ($diem as $d) {
echo "Điểm: $d<br>";
}
// Cách 3: Foreach với index
foreach ($diem as $index => $d) {
echo "Sinh viên $index: $d điểm<br>";
}
?>3. Mảng liên kết (Associative Array)
Mảng có key-value tự định nghĩa thay vì index số:
<?php
// Khai báo
$sinh_vien = [
"ten" => "Nguyễn Văn A",
"tuoi" => 20,
"lop" => "CNTT K15",
"diem_tb" => 8.5
];
// Truy cập
echo $sinh_vien["ten"]; // Nguyễn Văn A
echo $sinh_vien["tuoi"]; // 20
echo $sinh_vien["diem_tb"]; // 8.5
// Thêm phần tử mới
$sinh_vien["email"] = "test@email.com";
// Sửa giá trị
$sinh_vien["tuoi"] = 21;
?>3.1. Duyệt mảng liên kết
<?php
$sinh_vien = [
"ten" => "Nguyễn Văn A",
"tuoi" => 20,
"lop" => "CNTT K15",
"diem_tb" => 8.5
];
// Duyệt với foreach
foreach ($sinh_vien as $key => $value) {
echo "$key: $value<br>";
}
/*
Kết quả:
ten: Nguyễn Văn A
tuoi: 20
lop: CNTT K15
diem_tb: 8.5
*/
// Lấy danh sách keys
$keys = array_keys($sinh_vien);
print_r($keys); // ["ten", "tuoi", "lop", "diem_tb"]
// Lấy danh sách values
$values = array_values($sinh_vien);
print_r($values); // ["Nguyễn Văn A", 20, "CNTT K15", 8.5]
?>3.2. Kiểm tra key tồn tại
<?php
$sinh_vien = ["ten" => "An", "tuoi" => 20];
// Kiểm tra key
if (array_key_exists("ten", $sinh_vien)) {
echo "Key 'ten' tồn tại";
}
// Hoặc dùng isset()
if (isset($sinh_vien["email"])) {
echo "Có email";
} else {
echo "Không có email"; // Chạy dòng này
}
// Truy cập an toàn với toán tử ??
$email = $sinh_vien["email"] ?? "Chưa có email";
echo $email; // Chưa có email
?>4. Mảng đa chiều (Multidimensional Array)
Mảng chứa mảng, thường dùng để lưu danh sách có cấu trúc phức tạp:
<?php
// Mảng 2 chiều: Danh sách sinh viên
$danh_sach = [
["ten" => "Nguyễn Văn A", "tuoi" => 20, "diem" => 8.5],
["ten" => "Trần Thị B", "tuoi" => 19, "diem" => 9.0],
["ten" => "Lê Văn C", "tuoi" => 21, "diem" => 7.5]
];
// Truy cập phần tử
echo $danh_sach[0]["ten"]; // Nguyễn Văn A
echo $danh_sach[1]["diem"]; // 9.0
echo $danh_sach[2]["tuoi"]; // 21
// Duyệt mảng 2 chiều
foreach ($danh_sach as $sv) {
echo "Tên: " . $sv["ten"] . " - Điểm: " . $sv["diem"] . "<br>";
}
/*
Kết quả:
Tên: Nguyễn Văn A - Điểm: 8.5
Tên: Trần Thị B - Điểm: 9.0
Tên: Lê Văn C - Điểm: 7.5
*/
?>4.1. Mảng 3 chiều
<?php
// Danh sách lớp học
$truong = [
"CNTT" => [
"K15" => [
["ten" => "An", "diem" => 8.5],
["ten" => "Bình", "diem" => 7.0]
],
"K16" => [
["ten" => "Chi", "diem" => 9.0]
]
],
"Kinh te" => [
"K15" => [
["ten" => "Dung", "diem" => 8.0]
]
]
];
// Truy cập
echo $truong["CNTT"]["K15"][0]["ten"]; // An
echo $truong["CNTT"]["K16"][0]["diem"]; // 9.0
// Duyệt mảng 3 chiều
foreach ($truong as $khoa => $cac_lop) {
echo "<h3>Khoa: $khoa</h3>";
foreach ($cac_lop as $lop => $sinh_vien) {
echo "<h4>Lớp: $lop</h4>";
foreach ($sinh_vien as $sv) {
echo "- " . $sv["ten"] . ": " . $sv["diem"] . "<br>";
}
}
}
?>5. Các hàm xử lý mảng quan trọng
5.1. Hàm thông tin mảng
<?php
$mang = [1, 2, 3, 4, 5];
// Đếm số phần tử
echo count($mang); // 5
// Kiểm tra có phải mảng không
var_dump(is_array($mang)); // bool(true)
// Kiểm tra mảng rỗng
$mang_rong = [];
var_dump(empty($mang_rong)); // bool(true)
// In cấu trúc mảng
print_r($mang);
/*
Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
)
*/
// In chi tiết hơn
var_dump($mang);
?>5.2. Hàm tìm kiếm và kiểm tra
<?php
$mang = ["PHP", "JavaScript", "Python", "Java"];
// Tìm kiếm giá trị
if (in_array("PHP", $mang)) {
echo "Tìm thấy PHP"; // Chạy dòng này
}
// Tìm vị trí (index) của giá trị
$vi_tri = array_search("Python", $mang);
echo $vi_tri; // 2
// Kiểm tra key tồn tại
$sv = ["ten" => "An", "tuoi" => 20];
var_dump(array_key_exists("ten", $sv)); // true
?>5.3. Hàm sắp xếp mảng
<?php
// Sắp xếp indexed array
$so = [5, 2, 8, 1, 9];
sort($so); // Tăng dần
print_r($so); // [1, 2, 5, 8, 9]
rsort($so); // Giảm dần
print_r($so); // [9, 8, 5, 2, 1]
// Sắp xếp associative array
$tuoi = ["An" => 20, "Bình" => 18, "Chi" => 22];
asort($tuoi); // Sắp xếp theo value tăng dần
print_r($tuoi); // Bình => 18, An => 20, Chi => 22
ksort($tuoi); // Sắp xếp theo key (A-Z)
print_r($tuoi); // An => 20, Bình => 18, Chi => 22
arsort($tuoi); // Sắp xếp theo value giảm dần
krsort($tuoi); // Sắp xếp theo key (Z-A)
?>5.4. Hàm biến đổi mảng
<?php
$mang = [1, 2, 3, 4, 5];
// array_map: Áp dụng hàm cho từng phần tử
$binh_phuong = array_map(function($x) {
return $x * $x;
}, $mang);
print_r($binh_phuong); // [1, 4, 9, 16, 25]
// array_filter: Lọc phần tử theo điều kiện
$so_chan = array_filter($mang, function($x) {
return $x % 2 == 0;
});
print_r($so_chan); // [2, 4]
// array_reduce: Rút gọn mảng thành 1 giá trị
$tong = array_reduce($mang, function($carry, $item) {
return $carry + $item;
}, 0);
echo $tong; // 15
?>5.5. Hàm kết hợp mảng
<?php
$mang1 = [1, 2, 3];
$mang2 = [4, 5, 6];
// Gộp mảng
$gop = array_merge($mang1, $mang2);
print_r($gop); // [1, 2, 3, 4, 5, 6]
// Nối chuỗi từ mảng
$ten = ["Nguyễn", "Văn", "A"];
echo implode(" ", $ten); // Nguyễn Văn A
// Tách chuỗi thành mảng
$chuoi = "PHP,JavaScript,Python";
$mang = explode(",", $chuoi);
print_r($mang); // ["PHP", "JavaScript", "Python"]
// Tạo mảng từ range
$so = range(1, 10); // [1, 2, 3, ..., 10]
$chu = range('a', 'e'); // ['a', 'b', 'c', 'd', 'e']
?>5.6. Hàm cắt và slice mảng
<?php
$mang = ["A", "B", "C", "D", "E"];
// Lấy một phần mảng (không thay đổi mảng gốc)
$slice = array_slice($mang, 1, 3);
print_r($slice); // [B, C, D]
// Cắt và thay thế (thay đổi mảng gốc)
array_splice($mang, 1, 2, ["X", "Y"]);
print_r($mang); // [A, X, Y, D, E]
// Lấy phần tử duy nhất
$mang_unique = [1, 2, 2, 3, 3, 3, 4];
$unique = array_unique($mang_unique);
print_r($unique); // [1, 2, 3, 4]
?>6. Ví dụ thực tế
6.1. Quản lý giỏ hàng
<?php
$gio_hang = [];
// Thêm sản phẩm
function themSanPham(&$gio_hang, $id, $ten, $gia, $so_luong) {
$gio_hang[] = [
"id" => $id,
"ten" => $ten,
"gia" => $gia,
"so_luong" => $so_luong
];
}
themSanPham($gio_hang, 1, "Laptop", 15000000, 1);
themSanPham($gio_hang, 2, "Chuột", 200000, 2);
themSanPham($gio_hang, 3, "Bàn phím", 500000, 1);
// Tính tổng tiền
function tinhTongTien($gio_hang) {
$tong = 0;
foreach ($gio_hang as $sp) {
$tong += $sp["gia"] * $sp["so_luong"];
}
return $tong;
}
echo "Tổng tiền: " . number_format(tinhTongTien($gio_hang)) . " VNĐ";
// Tổng tiền: 16,200,000 VNĐ
// Hiển thị giỏ hàng
echo "<table border='1'>";
echo "<tr><th>Tên</th><th>Giá</th><th>SL</th><th>Thành tiền</th></tr>";
foreach ($gio_hang as $sp) {
$thanh_tien = $sp["gia"] * $sp["so_luong"];
echo "<tr>";
echo "<td>" . $sp["ten"] . "</td>";
echo "<td>" . number_format($sp["gia"]) . "</td>";
echo "<td>" . $sp["so_luong"] . "</td>";
echo "<td>" . number_format($thanh_tien) . "</td>";
echo "</tr>";
}
echo "</table>";
?>6.2. Thống kê điểm thi
<?php
$diem_thi = [
["ten" => "Nguyễn Văn A", "toan" => 8, "ly" => 7, "hoa" => 9],
["ten" => "Trần Thị B", "toan" => 9, "ly" => 8, "hoa" => 9],
["ten" => "Lê Văn C", "toan" => 6, "ly" => 7, "hoa" => 6],
["ten" => "Phạm Thị D", "toan" => 10, "ly" => 9, "hoa" => 10]
];
// Tính điểm trung bình từng môn
$tong_toan = $tong_ly = $tong_hoa = 0;
foreach ($diem_thi as $sv) {
$tong_toan += $sv["toan"];
$tong_ly += $sv["ly"];
$tong_hoa += $sv["hoa"];
}
$so_sv = count($diem_thi);
echo "Điểm TB Toán: " . round($tong_toan / $so_sv, 2) . "<br>";
echo "Điểm TB Lý: " . round($tong_ly / $so_sv, 2) . "<br>";
echo "Điểm TB Hóa: " . round($tong_hoa / $so_sv, 2) . "<br>";
// Tìm sinh viên điểm cao nhất
$diem_cao_nhat = 0;
$sv_gioi_nhat = "";
foreach ($diem_thi as $sv) {
$dtb = ($sv["toan"] + $sv["ly"] + $sv["hoa"]) / 3;
if ($dtb > $diem_cao_nhat) {
$diem_cao_nhat = $dtb;
$sv_gioi_nhat = $sv["ten"];
}
}
echo "<br>Sinh viên giỏi nhất: $sv_gioi_nhat (ĐTB: " . round($diem_cao_nhat, 2) . ")";
?>6.3. Phân trang dữ liệu
<?php
// Giả lập 100 sản phẩm
$san_pham = [];
for ($i = 1; $i <= 100; $i++) {
$san_pham[] = [
"id" => $i,
"ten" => "Sản phẩm $i",
"gia" => rand(100000, 1000000)
];
}
// Cấu hình phân trang
$so_sp_moi_trang = 10;
$trang_hien_tai = 3; // Trang 3
// Tính vị trí bắt đầu
$vi_tri_bat_dau = ($trang_hien_tai - 1) * $so_sp_moi_trang;
// Lấy dữ liệu trang hiện tại
$sp_trang_hien_tai = array_slice($san_pham, $vi_tri_bat_dau, $so_sp_moi_trang);
// Hiển thị
echo "<h3>Trang $trang_hien_tai</h3>";
foreach ($sp_trang_hien_tai as $sp) {
echo $sp["ten"] . " - " . number_format($sp["gia"]) . " VNĐ<br>";
}
// Tính số trang
$tong_trang = ceil(count($san_pham) / $so_sp_moi_trang);
echo "<br>Trang: ";
for ($i = 1; $i <= $tong_trang; $i++) {
if ($i == $trang_hien_tai) {
echo "<strong>$i</strong> ";
} else {
echo "<a href='?page=$i'>$i</a> ";
}
}
?>7. Bảng tổng hợp hàm mảng
| Hàm | Chức năng | Ví dụ |
|---|---|---|
count() | Đếm số phần tử | count([1,2,3]) → 3 |
array_push() | Thêm vào cuối | array_push($arr, "X") |
array_pop() | Xóa phần tử cuối | array_pop($arr) |
array_shift() | Xóa phần tử đầu | array_shift($arr) |
in_array() | Kiểm tra giá trị tồn tại | in_array("PHP", $arr) |
array_search() | Tìm vị trí giá trị | array_search("PHP", $arr) |
sort() | Sắp xếp tăng dần | sort($arr) |
rsort() | Sắp xếp giảm dần | rsort($arr) |
array_merge() | Gộp mảng | array_merge($a, $b) |
implode() | Nối mảng thành chuỗi | implode(",", $arr) |
explode() | Tách chuỗi thành mảng | explode(",", $str) |
array_slice() | Lấy một phần mảng | array_slice($arr, 1, 3) |
Tóm tắt
Qua bài này bạn đã nắm được:
- ✅ Mảng trong PHP lưu trữ nhiều giá trị trong một biến, truy cập qua index hoặc key
- ✅ Indexed Array: Mảng chỉ số tự động (0, 1, 2...), dùng
$arr[0]để truy cập - ✅ Associative Array: Mảng key-value tự định nghĩa, dùng
$arr["key"] - ✅ Multidimensional Array: Mảng chứa mảng, dùng cho dữ liệu phức tạp
- ✅ Duyệt mảng: Dùng
foreachlà tối ưu nhất - ✅ Hàm thêm/xóa:
array_push(),array_pop(),array_shift(),unset() - ✅ Hàm tìm kiếm:
in_array(),array_search(),array_key_exists() - ✅ Hàm sắp xếp:
sort(),rsort(),asort(),ksort() - ✅ Hàm biến đổi:
array_map(),array_filter(),array_reduce() - ✅ Hàm kết hợp:
array_merge(),implode(),explode()
Bài tiếp theo, bạn sẽ học về xử lý chuỗi trong PHP để thao tác với text và dữ liệu văn bản.
🎯 Bài tập thực hành
- Bài 1: Tạo mảng chứa 5 số bất kỳ. Viết code tính tổng, tìm số lớn nhất, nhỏ nhất và sắp xếp mảng tăng dần.
- Bài 2: Tạo mảng associative lưu thông tin 1 sản phẩm (tên, giá, số lượng). Viết hàm tính thành tiền và hiển thị thông tin sản phẩm.
- Bài 3: Tạo mảng 2 chiều chứa thông tin 3 sinh viên (tên, điểm toán, lý, hóa). Tính điểm trung bình từng sinh viên và tìm sinh viên có điểm cao nhất.
Gợi ý Bài 1:
<?php
$mang = [15, 8, 23, 4, 19];
// Tính tổng
$tong = array_sum($mang);
echo "Tổng: $tong<br>"; // 69
// Tìm max, min
$max = max($mang);
$min = min($mang);
echo "Lớn nhất: $max<br>"; // 23
echo "Nhỏ nhất: $min<br>"; // 4
// Sắp xếp
sort($mang);
echo "Mảng sau khi sắp xếp: ";
print_r($mang); // [4, 8, 15, 19, 23]
?>Gợi ý Bài 2:
<?php
$san_pham = [
"ten" => "Laptop Dell",
"gia" => 15000000,
"so_luong" => 2
];
function tinhThanhTien($sp) {
return $sp["gia"] * $sp["so_luong"];
}
echo "Tên: " . $san_pham["ten"] . "<br>";
echo "Giá: " . number_format($san_pham["gia"]) . " VNĐ<br>";
echo "Số lượng: " . $san_pham["so_luong"] . "<br>";
echo "Thành tiền: " . number_format(tinhThanhTien($san_pham)) . " VNĐ";
?>Gợi ý Bài 3:
<?php
$sinh_vien = [
["ten" => "An", "toan" => 8, "ly" => 7, "hoa" => 9],
["ten" => "Bình", "toan" => 9, "ly" => 8, "hoa" => 8],
["ten" => "Chi", "toan" => 7, "ly" => 6, "hoa" => 7]
];
$diem_cao_nhat = 0;
$sv_gioi_nhat = "";
foreach ($sinh_vien as $sv) {
$dtb = ($sv["toan"] + $sv["ly"] + $sv["hoa"]) / 3;
echo $sv["ten"] . ": ĐTB = " . round($dtb, 2) . "<br>";
if ($dtb > $diem_cao_nhat) {
$diem_cao_nhat = $dtb;
$sv_gioi_nhat = $sv["ten"];
}
}
echo "<br>Sinh viên cao điểm nhất: $sv_gioi_nhat (" . round($diem_cao_nhat, 2) . ")";
?>