Tìm hiểu các loại mảng trong PHP

PHP Tutorial | by Học PHP

Trong lập trình PHP, bạn sẽ thường xuyên làm việc với rất nhiều dữ liệu. Tưởng tượng bạn cần lưu trữ danh sách tên của 100 học sinh, điểm thi của từng môn, hay thông tin chi tiết của hàng ngàn sản phẩm trong một cửa hàng trực tuyến. Nếu mỗi mục dữ liệu lại cần một biến riêng biệt (ví dụ: $hocSinh1, $hocSinh2, $diemMonToanHocSinhA), mọi thứ sẽ nhanh chóng trở nên cực kỳ lộn xộn, khó quản lý, và gần như không thể xử lý hiệu quả.

Đây chính là lúc mảng (array) trở thành một trong những công cụ mạnh mẽ và linh hoạt nhất của PHP. Một mảng giống như một chiếc tủ có nhiều ngăn, cho phép bạn cất giữ nhiều giá trị khác nhau dưới một cái tên duy nhất nhưng vẫn giữ được sự ngăn nắp và có tổ chức. Từ những danh sách đơn giản cho đến các cấu trúc dữ liệu phức tạp, mảng là nền tảng để bạn quản lý thông tin trong ứng dụng PHP của mình. Hãy cùng tìm hiểu sâu hơn về mảng là gì và khám phá ba loại mảng chính mà PHP cung cấp, để bạn có thể chọn đúng "chiếc tủ" cho "dữ liệu" của mình nhé!

Tại sao cần mảng?

Hãy tưởng tượng bạn đang xây dựng một ứng dụng PHP để quản lý danh sách học sinh. Bạn cần lưu tên của 50 học sinh, điểm môn Toán của 50 học sinh đó, và cả thông tin về địa chỉ email của họ.

Vấn Đề: Lưu Từng Dữ Liệu Vào Một Biến Riêng Lẻ

Nếu không có mảng, bạn sẽ phải làm gì? Có lẽ bạn sẽ tạo ra hàng loạt biến riêng lẻ như thế này:

<?php
// Tên học sinh
$hocSinh1_ten = "Nguyễn Văn An";
$hocSinh2_ten = "Trần Thị Bình";
$hocSinh3_ten = "Lê Văn Cường";
// ... và cứ thế cho đến $hocSinh50_ten

// Điểm môn Toán
$hocSinh1_diemToan = 8.5;
$hocSinh2_diemToan = 7.0;
$hocSinh3_diemToan = 9.2;
// ... và cứ thế cho đến $hocSinh50_diemToan

// Email học sinh
$hocSinh1_email = "[email protected]";
$hocSinh2_email = "[email protected]";
$hocSinh3_email = "[email protected]";
// ... và cứ thế cho đến $hocSinh50_email
?>

Bạn có thấy vấn đề không?

  • Dài dòng và lộn xộn: Mã nguồn trở nên cực kỳ dài và khó đọc, chỉ để lưu trữ một loại dữ liệu.

  • Khó quản lý: Nếu bạn cần thêm một học sinh mới, bạn lại phải tạo thêm 3 biến nữa. Nếu học sinh đó nghỉ học, bạn lại phải xóa 3 biến.

  • Khó xử lý: Làm sao để duyệt qua danh sách 50 học sinh để in tên của tất cả bọn họ? Bạn sẽ phải viết 50 dòng echo riêng biệt, hoặc phải dùng một cấu trúc rất phức tạp. Làm sao để tìm học sinh có điểm cao nhất? Cực kỳ khó khăn!

Giải Pháp: Mảng (Array) – Biến "Đa Năng"

Để giải quyết vấn đề này, PHP cung cấp một cấu trúc dữ liệu mạnh mẽ gọi là mảng (array). Thay vì mỗi giá trị là một biến riêng biệt, một mảng là một biến đặc biệt có khả năng lưu trữ nhiều giá trị cùng lúc dưới một tên duy nhất. Mỗi giá trị trong mảng được sắp xếp và có thể truy cập được thông qua một "địa chỉ" riêng.

Hãy trở lại với ví dụ học sinh của chúng ta, nhưng lần này sử dụng mảng:

<?php
// Sử dụng mảng để lưu tên học sinh
$tenHocSinh = ["Nguyễn Văn An", "Trần Thị Bình", "Lê Văn Cường"];

// Sử dụng mảng để lưu điểm môn Toán
$diemToan = [8.5, 7.0, 9.2];

// Sử dụng mảng để lưu email
$emailHocSinh = ["[email protected]", "[email protected]", "[email protected]"];

// Để truy cập tên học sinh đầu tiên:
echo "Học sinh đầu tiên: " . $tenHocSinh[0] . "<br>"; // Output: Học sinh đầu tiên: Nguyễn Văn An

// Để in ra tất cả tên học sinh (sẽ học kỹ hơn về vòng lặp sau):
echo "<h3>Danh sách tên học sinh:</h3>";
foreach ($tenHocSinh as $ten) {
    echo $ten . "<br>";
}
/*
Output:
Danh sách tên học sinh:
Nguyễn Văn An
Trần Thị Bình
Lê Văn Cường
*/
?>

Ví Dụ Đời Thường: Một Chiếc Tủ Nhiều Ngăn

Hãy nghĩ về mảng giống như một chiếc tủ nhiều ngăn kéo.

  • Chiếc tủ chính là tên của biến mảng của bạn (ví dụ: $tenHocSinh).

  • Mỗi ngăn kéo là nơi bạn đặt một món đồ (một giá trị).

  • Nhãn hoặc số thứ tự trên ngăn kéo chính là "khóa" (key) dùng để tìm món đồ đó.

Thay vì phải có nhiều chiếc tủ nhỏ đặt rải rác khắp phòng (mỗi tủ một món đồ), bạn chỉ cần một chiếc tủ lớn, có tổ chức, giúp bạn dễ dàng cất và lấy đồ.

Nhờ có mảng, việc quản lý và xử lý tập hợp dữ liệu trở nên hiệu quả, có tổ chức và dễ dàng hơn rất nhiều. Trong các phần tiếp theo, chúng ta sẽ đi sâu vào các loại mảng khác nhau trong PHP và cách sử dụng chúng.

Mảng là gì?

Sau khi hiểu được lý do tại sao chúng ta cần mảng, giờ hãy đi sâu hơn vào khái niệm cơ bản của nó trong PHP.

Định Nghĩa Mảng

Trong lập trình, một mảng (array) là một cấu trúc dữ liệu đặc biệt. Nó cho phép bạn lưu trữ một tập hợp nhiều giá trị có liên quan dưới một tên biến duy nhất. Thay vì phải tạo ra hàng chục biến khác nhau cho các mục dữ liệu tương tự, bạn chỉ cần một biến mảng để chứa tất cả.

Hãy nghĩ về nó như một danh sách. Mỗi mục trong danh sách đó là một giá trị, và mỗi mục đều có một "địa chỉ" hoặc "nhãn" riêng để bạn có thể tìm thấy nó. Trong mảng PHP, "địa chỉ" hoặc "nhãn" này được gọi là khóa (key), và mục dữ liệu thực tế được gọi là giá trị (value).

  • Khóa (Key): Là định danh duy nhất để truy cập đến một giá trị cụ thể trong mảng. Khóa có thể là một số nguyên (ví dụ: 0, 1, 2) hoặc một chuỗi ký tự (ví dụ: "ten", "tuoi").

  • Giá trị (Value): Là dữ liệu thực tế được lưu trữ trong mảng (có thể là số, chuỗi, boolean, hoặc thậm chí là một mảng khác).

Cách Khai Báo Mảng Cơ Bản

PHP cung cấp hai cách phổ biến để khai báo (tạo) một mảng:

Sử dụng từ khóa array(): Đây là cách truyền thống.

$myArray = array("giá trị 1", "giá trị 2", "giá trị 3");

Sử dụng cú pháp ngoặc vuông []: Đây là cách hiện đại và được khuyến khích sử dụng từ PHP 5.4 trở đi vì nó ngắn gọn và dễ đọc hơn.

$myArray = ["giá trị 1", "giá trị 2", "giá trị 3"];

Ví Dụ Cơ Bản: Mảng Chứa Danh Sách Các Loại Trái Cây

Hãy tạo một mảng đơn giản để lưu trữ danh sách các loại trái cây yêu thích của bạn.

<?php
echo "<h3>Ví dụ về Mảng cơ bản: Danh sách Trái Cây</h3>";

// Cách 1: Khai báo mảng bằng từ khóa array()
$fruits1 = array("Táo", "Cam", "Xoài", "Nho");
echo "Mảng fruits1 được tạo bằng array():<br>";
// In toàn bộ mảng để xem cấu trúc (sẽ học kỹ hơn về hàm print_r() sau)
print_r($fruits1);
echo "<br><br>";


// Cách 2: Khai báo mảng bằng cú pháp ngoặc vuông [] (cách hiện đại)
$fruits2 = ["Chuối", "Dâu", "Ổi", "Thanh Long"];
echo "Mảng fruits2 được tạo bằng []:<br>";
print_r($fruits2);
echo "<br><br>";


// --- Cách truy cập các giá trị trong mảng ---
// Trong mảng chỉ mục (sẽ học kỹ hơn ở phần sau), các khóa mặc định bắt đầu từ 0.
// Ví dụ: "Táo" có khóa là 0, "Cam" có khóa là 1, v.v.

echo "Truy cập các giá trị trong mảng fruits1:<br>";
echo "Loại trái cây đầu tiên: " . $fruits1[0] . "<br>"; // Truy cập giá trị tại khóa 0
echo "Loại trái cây thứ ba: " . $fruits1[2] . "<br>";   // Truy cập giá trị tại khóa 2

echo "<br>Truy cập các giá trị trong mảng fruits2:<br>";
echo "Loại trái cây thứ hai: " . $fruits2[1] . "<br>";  // Truy cập giá trị tại khóa 1
echo "Loại trái cây cuối cùng: " . $fruits2[3] . "<br>"; // Truy cập giá trị tại khóa 3

/*
Output của đoạn code trên sẽ là:

Ví dụ về Mảng cơ bản: Danh sách Trái Cây
Mảng fruits1 được tạo bằng array():
Array
(
    [0] => Táo
    [1] => Cam
    [2] => Xoài
    [3] => Nho
)

Mảng fruits2 được tạo bằng []:
Array
(
    [0] => Chuối
    [1] => Dâu
    [2] => Ổi
    [3] => Thanh Long
)

Truy cập các giá trị trong mảng fruits1:
Loại trái cây đầu tiên: Táo
Loại trái cây thứ ba: Xoài

Truy cập các giá trị trong mảng fruits2:
Loại trái cây thứ hai: Dâu
Loại trái cây cuối cùng: Thanh Long
*/
?>

Giải thích ví dụ:

  • Chúng ta đã tạo hai mảng, $fruits1$fruits2, chứa danh sách các loại trái cây.

  • Khi bạn khai báo mảng mà không chỉ định khóa, PHP sẽ tự động gán các khóa là số nguyên, bắt đầu từ 0. Vì vậy, "Táo" có khóa là 0, "Cam" có khóa là 1, v.v.

  • Để truy cập một giá trị cụ thể trong mảng, bạn sử dụng tên biến mảng, theo sau là khóa của giá trị đó đặt trong cặp ngoặc vuông (ví dụ: $fruits1[0]).

Các Loại Mảng trong PHP

PHP rất linh hoạt trong cách bạn có thể lưu trữ và tổ chức dữ liệu. Các mảng trong PHP được phân loại chính thành 3 loại dựa trên cách chúng ta định nghĩa và sử dụng "khóa" (key) để truy cập các "giá trị" (value).

Mảng Chỉ Mục (Indexed Arrays / Numeric Arrays)

Khái niệm: Đây là loại mảng cơ bản nhất. Các "khóa" của nó là các số nguyên, và chúng thường bắt đầu từ 0, 1, 2, 3,... nếu bạn không chỉ định gì. Bạn có thể hình dung nó như một danh sách được đánh số thứ tự.

Cách tạo:

Tự động gán chỉ mục (phổ biến nhất): PHP sẽ tự động gán các chỉ mục số bắt đầu từ 0 cho các giá trị mà bạn đưa vào.

<?php
$seasons = array("Xuân", "Hạ", "Thu", "Đông");
// Hoặc cách hiện đại (được khuyến khích):
$weekDays = ["Thứ Hai", "Thứ Ba", "Thứ Tư", "Thứ Năm", "Thứ Sáu", "Thứ Bảy", "Chủ Nhật"];
?>

Gán chỉ mục thủ công: Bạn cũng có thể tự chỉ định chỉ mục số cho từng giá trị.

<?php
$temperatures = array(0 => 25, 1 => 30, 2 => 28);
// Hoặc
$scores = [10 => 95, 11 => 88, 12 => 92]; // Chỉ mục có thể không bắt đầu từ 0 và không liên tiếp
?>

Cách truy cập: Để lấy một giá trị từ mảng chỉ mục, bạn dùng tên mảng theo sau là chỉ mục số của giá trị đó trong cặp ngoặc vuông [].

<?php
echo "<h3>1. Mảng Chỉ Mục (Indexed Arrays)</h3>";

// Ví dụ: Danh sách các mùa trong năm
$seasons = ["Xuân", "Hạ", "Thu", "Đông"];

echo "Mùa đầu tiên là: " . $seasons[0] . "<br>"; // Truy cập "Xuân"
echo "Mùa thứ ba là: " . $seasons[2] . "<br>";   // Truy cập "Thu"

// Ví dụ: Danh sách các ngày trong tuần
$weekDays = ["Thứ Hai", "Thứ Ba", "Thứ Tư"]; // Chỉ minh họa 3 ngày

echo "Ngày làm việc đầu tiên là: " . $weekDays[0] . "<br>"; // Truy cập "Thứ Hai"
echo "Ngày làm việc thứ hai là: " . $weekDays[1] . "<br>";   // Truy cập "Thứ Ba"

// Thêm một phần tử vào cuối mảng chỉ mục
$seasons[] = "Mùa thứ 5 (không có thật)"; // Sẽ được gán chỉ mục là 4
echo "Phần tử mới được thêm vào: " . $seasons[4] . "<br>";

/*
Output:
1. Mảng Chỉ Mục (Indexed Arrays)
Mùa đầu tiên là: Xuân
Mùa thứ ba là: Thu
Ngày làm việc đầu tiên là: Thứ Hai
Ngày làm việc thứ hai là: Thứ Ba
Phần tử mới được thêm vào: Mùa thứ 5 (không có thật)
*/
?>

Mảng Kết Hợp (Associative Arrays)

Khái niệm: Khác với mảng chỉ mục, mảng kết hợp sử dụng các chuỗi ký tự làm "khóa" thay vì số. Điều này giúp bạn gán những cái tên có ý nghĩa (label) cho các giá trị, làm cho mã dễ đọc và dễ hiểu hơn rất nhiều, đặc biệt khi dữ liệu có ý nghĩa cụ thể.

Cách tạo: Bạn sử dụng cú pháp key => value để gán một khóa chuỗi cho mỗi giá trị.

<?php
// Thông tin của một người
$person = array("ten" => "Nguyễn Văn A", "tuoi" => 30, "nghe_nghiep" => "Lập trình viên");
// Hoặc cách hiện đại:
$product = ["ma_sp" => "SP001", "ten_sp" => "Bánh quy", "gia" => 25000, "so_luong" => 100];
?>

Cách truy cập: Để lấy một giá trị từ mảng kết hợp, bạn dùng tên mảng theo sau là khóa chuỗi của giá trị đó trong cặp ngoặc vuông [] (lưu ý khóa chuỗi phải đặt trong dấu nháy đơn hoặc kép).

<?php
echo "<h3>2. Mảng Kết Hợp (Associative Arrays)</h3>";

// Ví dụ: Thông tin của một người
$person = [
    "ten" => "Nguyễn Thị B",
    "tuoi" => 25,
    "nghe_nghiep" => "Thiết kế đồ họa"
];

echo "Tên của người đó là: " . $person["ten"] . "<br>";           // Truy cập giá trị bằng khóa "ten"
echo "Tuổi của người đó là: " . $person["tuoi"] . "<br>";         // Truy cập giá trị bằng khóa "tuoi"
echo "Nghề nghiệp: " . $person["nghe_nghiep"] . "<br>"; // Truy cập giá trị bằng khóa "nghe_nghiep"

// Ví dụ: Thông tin sản phẩm
$product = [
    "ma_sp" => "DT001",
    "ten_sp" => "Điện thoại ABC",
    "gia" => 5000000,
    "mau_sac" => "Đen"
];

echo "Tên sản phẩm: " . $product["ten_sp"] . "<br>";
echo "Giá sản phẩm: " . number_format($product["gia"]) . " VNĐ<br>";

// Thêm một phần tử mới vào mảng kết hợp
$person["thanh_pho"] = "Hà Nội";
echo "Thành phố: " . $person["thanh_pho"] . "<br>";

/*
Output:
2. Mảng Kết Hợp (Associative Arrays)
Tên của người đó là: Nguyễn Thị B
Tuổi của người đó là: 25
Nghề nghiệp: Thiết kế đồ họa
Tên sản phẩm: Điện thoại ABC
Giá sản phẩm: 5.000.000 VNĐ
Thành phố: Hà Nội
*/
?>

Mảng Đa Chiều (Multidimensional Arrays)

Khái niệm: Mảng đa chiều là một mảng mà mỗi "giá trị" của nó lại chính là một mảng khác. Điều này cho phép bạn tạo ra các cấu trúc dữ liệu phức tạp hơn, có nhiều cấp bậc, giống như một bảng hoặc một danh sách các đối tượng.

Mục đích: Chúng cực kỳ hữu ích khi bạn cần lưu trữ dữ liệu có quan hệ "một-nhiều" hoặc khi bạn cần biểu diễn một tập hợp các "bản ghi", mỗi bản ghi lại có nhiều thuộc tính.

Cách tạo: Bạn tạo mảng đa chiều bằng cách lồng các mảng vào nhau.

<?php
// Danh sách các học sinh, mỗi học sinh là một mảng kết hợp
$students = [
    ["name" => "An", "age" => 18, "grades" => ["Math" => 9, "Physics" => 8]],
    ["name" => "Bình", "age" => 19, "grades" => ["Math" => 7, "Physics" => 9]],
    ["name" => "Cường", "age" => 18, "grades" => ["Math" => 8, "Physics" => 7]],
];

// Ma trận số học (mảng của các mảng chỉ mục)
$matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
];
?>

Cách truy cập: Để truy cập một giá trị trong mảng đa chiều, bạn dùng nhiều chỉ mục hoặc khóa liên tiếp, mỗi cái trong một cặp ngoặc vuông [], theo thứ tự cấp bậc từ ngoài vào trong.

<?php
echo "<h3>3. Mảng Đa Chiều (Multidimensional Arrays)</h3>";

// Ví dụ: Danh sách học sinh (mỗi học sinh là một mảng kết hợp)
$students = [
    // Học sinh 0
    [
        "name" => "Nguyễn An",
        "age" => 18,
        "scores" => ["Math" => 9, "Physics" => 8, "Chemistry" => 7]
    ],
    // Học sinh 1
    [
        "name" => "Trần Bình",
        "age" => 19,
        "scores" => ["Math" => 7, "Physics" => 9, "Chemistry" => 8]
    ]
];

// Truy cập tên của học sinh đầu tiên (khóa 0 của mảng ngoài, khóa "name" của mảng trong)
echo "Tên học sinh đầu tiên: " . $students[0]["name"] . "<br>";

// Truy cập điểm môn Lý của học sinh thứ hai (khóa 1 của mảng ngoài, khóa "Physics" của mảng "scores")
echo "Điểm Lý của Trần Bình: " . $students[1]["scores"]["Physics"] . "<br>";

echo "<br>";

// Ví dụ: Ma trận số học (mảng của các mảng chỉ mục)
$matrix = [
    [10, 20, 30], // Hàng 0
    [40, 50, 60], // Hàng 1
    [70, 80, 90]  // Hàng 2
];

// Truy cập phần tử ở hàng 1, cột 2 (giá trị 60)
echo "Phần tử tại hàng 1, cột 2: " . $matrix[1][2] . "<br>";

// Truy cập phần tử ở hàng 0, cột 0 (giá trị 10)
echo "Phần tử tại hàng 0, cột 0: " . $matrix[0][0] . "<br>";

/*
Output:
3. Mảng Đa Chiều (Multidimensional Arrays)
Tên học sinh đầu tiên: Nguyễn An
Điểm Lý của Trần Bình: 9

Phần tử tại hàng 1, cột 2: 60
Phần tử tại hàng 0, cột 0: 10
*/
?>

Kết bài

Qua quá trình tìm hiểu, chúng ta đã thấy rằng mảng (array) là một trong những cấu trúc dữ liệu cơ bản và mạnh mẽ nhất mà PHP cung cấp. Thay vì phải quản lý vô số biến riêng lẻ cho các dữ liệu liên quan, mảng cho phép chúng ta nhóm chúng lại dưới một tên duy nhất, tạo ra sự ngăn nắp và hiệu quả vượt trội.

Chúng ta đã khám phá ba loại mảng chính trong PHP:

  • Mảng Chỉ Mục (Indexed Arrays): Hoàn hảo cho các danh sách đơn giản, nơi thứ tự là quan trọng và các phần tử được truy cập bằng chỉ số số học.

  • Mảng Kết Hợp (Associative Arrays): Lý tưởng cho việc lưu trữ dữ liệu có ý nghĩa, cho phép bạn sử dụng các chuỗi làm "khóa" để truy cập thông tin một cách trực quan.

  • Mảng Đa Chiều (Multidimensional Arrays): Cung cấp khả năng lưu trữ dữ liệu phức tạp, có cấu trúc phân cấp, rất phù hợp cho việc biểu diễn bảng, danh sách đối tượng, hoặc bất kỳ tập dữ liệu nào cần nhiều hơn một chiều.

Việc nắm vững cách tạo, truy cập và sử dụng linh hoạt các loại mảng này là kỹ năng thiết yếu cho bất kỳ lập trình viên PHP nào. Chúng không chỉ giúp bạn tổ chức dữ liệu một cách logic mà còn là nền tảng để bạn làm việc với các cấu trúc dữ liệu phức tạp hơn và xây dựng các ứng dụng mạnh mẽ, dễ bảo trì. Hãy tận dụng sức mạnh của mảng để biến những dữ liệu rời rạc thành những tập hợp có ý nghĩa trong các dự án PHP của bạn!

Bài viết liên quan