Mảng là cấu trúc dữ liệu quan trọng nhất của PHP: dữ liệu form, kết quả truy vấn, cấu hình, JSON đều là mảng. Bài này học mảng chỉ số, mảng kết hợp, mảng nhiều chiều và bộ hàm xử lý mảng.
Bạn sẽ học được
- Tạo và truy cập mảng chỉ số, mảng kết hợp
- Thêm, xóa, tìm, sắp xếp phần tử
- Dùng mảng nhiều chiều mô tả bảng dữ liệu
- Dùng array_map, array_filter, array_column, extract/compact, JSON
Khái niệm và lý thuyết
Mảng PHP thực chất là bản đồ có thứ tự (ordered map): khóa có thể là số nguyên hoặc chuỗi, giá trị là bất kỳ kiểu nào, kể cả mảng khác. Nhờ vậy một kiểu dữ liệu phục vụ được cả danh sách, từ điển, bảng và cây.
Mảng chỉ số và mảng kết hợp
<?php
$mon = ["Toán", "Tin", "Anh"]; // chỉ số 0,1,2
$mon[] = "Văn"; // thêm cuối
echo $mon[1], " ", count($mon); // Tin 4
$sv = ["ma" => "SV001", "ten" => "Lò Văn An", "diem" => 8.5];
$sv["lop"] = "K66 Tin";
echo $sv["ten"];
foreach ($sv as $k => $v) echo "$k: $v<br>";
print_r($sv); // xem nhanh cấu trúc
var_dump(isset($sv["email"]), array_key_exists("diem", $sv));Mảng nhiều chiều
<?php
$lop = [
["ma" => "SV001", "ten" => "An", "diem" => 8.5],
["ma" => "SV002", "ten" => "Bình", "diem" => 6.0],
["ma" => "SV003", "ten" => "Chi", "diem" => 9.2],
];
echo $lop[2]["ten"]; // Chi
?>
<table border="1">
<?php foreach ($lop as $s): ?>
<tr><td><?= $s["ma"] ?></td><td><?= $s["ten"] ?></td><td><?= $s["diem"] ?></td></tr>
<?php endforeach; ?>
</table>
<?php
$ten_ds = array_column($lop, "ten"); // ["An","Bình","Chi"]
$theo_ma = array_column($lop, null, "ma"); // khóa là mã SV
$diem_tb = array_sum(array_column($lop, "diem")) / count($lop);Thêm, xóa, tìm, sắp xếp
<?php
$ds = [5, 3, 8, 1];
array_push($ds, 9, 2); array_pop($ds); array_unshift($ds, 0); array_shift($ds);
unset($ds[1]); // xóa theo khóa (để lại lỗ)
$ds = array_values($ds); // đánh lại chỉ số
var_dump(in_array(8, $ds)); // true
echo array_search(8, $ds); // vị trí
sort($ds); rsort($ds); // sắp xếp giá trị (mất khóa)
asort($diem); ksort($diem); // giữ khóa / theo khóa
usort($lop, fn($a, $b) => $b["diem"] <=> $a["diem"]); // theo điểm giảm dần
$gioi = array_filter($lop, fn($s) => $s["diem"] >= 8.5);
$ten_hoa = array_map(fn($s) => mb_strtoupper($s["ten"]), $lop);
[$a, $b] = [1, 2]; // phân rã
["ten" => $t, "diem" => $d] = $lop[0];
$gop = array_merge($mon, ["Sử"]); $cat = array_slice($mon, 0, 2);
echo implode(", ", $mon); print_r(explode(",", "a,b,c"));Mảng và JSON
<?php
$json = json_encode($lop, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
echo "<pre>$json</pre>";
$lai = json_decode($json, true); // true: trả về mảng thay vì object
echo $lai[0]["ten"];JSON là định dạng trao đổi với JavaScript (AJAX) và API; JSON_UNESCAPED_UNICODE giữ nguyên tiếng Việt.
Mẹo hay
Dùng print_r($mang) trong thẻ <pre> hoặc var_dump để nhìn cấu trúc mảng khi gỡ lỗi; với mảng lớn dùng array_slice xem một phần.
Lưu ý
Truy cập khóa không tồn tại gây cảnh báo “Undefined array key”. Kiểm tra bằng isset hoặc dùng $m["k"] ?? mặc_định.
Thực hành
- Tạo mảng 5 sinh viên, in bảng HTML, tô màu sinh viên dưới 5 điểm.
- Sắp xếp danh sách theo tên (dùng strcoll hoặc <=>) rồi theo điểm.
- Đếm số sinh viên mỗi xếp loại bằng mảng kết hợp.
- Chuyển danh sách sang JSON, lưu ra tệp, đọc lại và in.
Tóm tắt bài học
- Mảng chỉ số, mảng kết hợp, nhiều chiều; truy cập bằng [].
- count, in_array, array_search, sort/usort, array_filter/map/column.
- Phân rã [$a, $b] = ...; implode/explode với chuỗi.
- json_encode/json_decode chuyển đổi với JSON.