Mảng (Array) trong PHP - Hướng dẫn toàn diện
Lập trình PHP

Mảng (Array) trong PHP - Hướng dẫn toàn diện

<?xml encoding="utf-8" ?>

Chào mừng bạn đến với bài học tiếp theo trong series PHP tại TheGioiPHP.com! Ở các bài học trước, chúng ta đã làm quen với biến, hằng, và các kiểu dữ liệu cơ bản như chuỗi, số, boolean. Chúng rất hữu ích để lưu trữ một thông tin đơn lẻ, ví dụ như tên của một người dùng hay giá của một sản phẩm.

Nhưng hãy tưởng tượng một bài toán thực tế hơn: Làm thế nào để lưu trữ một danh sách gồm 50 sinh viên? Hoặc một danh sách 20 sản phẩm trong giỏ hàng? Chẳng lẽ chúng ta lại tạo ra 50 biến $sinhVien1$sinhVien2,...? Cách đó thật sự không hiệu quả.

Đây chính là lúc Mảng (Array) trong PHP xuất hiện như một vị cứu tinh. Mảng là một trong những cấu trúc dữ liệu mạnh mẽ và được sử dụng nhiều nhất trong PHP. Việc làm chủ mảng sẽ mở ra cho bạn khả năng xử lý các tập hợp dữ liệu lớn, một kỹ năng không thể thiếu của bất kỳ lập trình viên web nào.

Trong bài viết này, chúng ta sẽ cùng nhau đi sâu vào thế giới của mảng trong PHP, từ khái niệm cơ bản, các loại mảng khác nhau, cho đến những hàm xử lý mảng thông dụng nhất.

Phần 1: Array trong PHP là gì?

Mảng (Array) trong PHP là một biến đặc biệt có khả năng lưu trữ nhiều giá trị cùng một lúc.

Hãy hình dung mảng giống như một tủ hồ sơ có nhiều ngăn kéo. Thay vì để mỗi tài liệu trên một bàn riêng (một biến riêng), bạn có thể sắp xếp tất cả chúng vào các ngăn kéo của cùng một tủ (một biến mảng duy nhất). Mỗi ngăn kéo sẽ có một "nhãn" để bạn biết bên trong chứa gì.

Trong PHP, "nhãn" này được gọi là khóa (key), và "tài liệu" bên trong được gọi là giá trị (value). Một mảng là một tập hợp của các cặp key => value.

chèn hình

(Mô tả hình: Sơ đồ minh họa một biến mảng chứa nhiều giá trị, mỗi giá trị có một key tương ứng)

PHP hỗ trợ ba loại mảng chính, và chúng ta sẽ tìm hiểu chi tiết từng loại:

  1. Mảng tuần tự (Indexed Arrays): Mảng có khóa là các số nguyên.
  2. Mảng kết hợp (Associative Arrays): Mảng có khóa là các chuỗi ký tự do bạn tự đặt.
  3. Mảng đa chiều (Multidimensional Arrays): Mảng chứa một hoặc nhiều mảng khác bên trong.

Phần 2: Mảng Tuần Tự (Indexed Arrays)

Đây là loại mảng đơn giản và cơ bản nhất. Trong mảng tuần tự, các phần tử được đánh chỉ mục (index) bằng các số nguyên, và chỉ mục này luôn bắt đầu từ 0.

1. Cách tạo mảng tuần tự trong PHP

Có hai cách phổ biến:

a. Sử dụng cú pháp ngắn [] (Khuyên dùng)

Đây là cách hiện đại, ngắn gọn và được ưa chuộng nhất kể từ PHP 5.4.

<?php
// Tạo một mảng chứa danh sách các trình duyệt web
$browsers = ["Chrome", "Firefox", "Safari", "Edge", "Opera"];
?>

b. Sử dụng cấu trúc array()

Đây là cách truyền thống, bạn vẫn sẽ gặp nó trong các code cũ.

<?php
$browsers = array("Chrome", "Firefox", "Safari", "Edge", "Opera");
?>

2. Cách truy cập các phần tử trong mảng

Để lấy ra một giá trị từ mảng, bạn sử dụng tên biến mảng theo sau là cặp dấu ngoặc vuông [], bên trong là chỉ mục (index) của phần tử bạn muốn lấy.

Hãy nhớ: Phần tử đầu tiên luôn có chỉ mục là 0.

<?php
$browsers = ["Chrome", "Firefox", "Safari", "Edge", "Opera"];

// Truy cập và in ra phần tử đầu tiên (index = 0)
echo $browsers[0]; // Kết quả: Chrome

echo "<br>";

// Truy cập và in ra phần tử thứ ba (index = 2)
echo $browsers[2]; // Kết quả: Safari
?>

Lỗi thường gặp: Cố gắng truy cập một chỉ mục không tồn tại sẽ gây ra lỗi "Undefined offset". Ví dụ, trong mảng trên chỉ có index từ 0 đến 4, nếu bạn echo $browsers[5]; sẽ bị lỗi.

3. Cách thay đổi giá trị của một phần tử

Bạn có thể dễ dàng thay đổi giá trị của một phần tử bằng cách gán cho nó một giá trị mới.

<?php
$browsers = ["Chrome", "Firefox", "Safari"];
echo "Trình duyệt thứ hai ban đầu là: " . $browsers[1]; // Firefox

// Thay đổi giá trị của phần tử có index = 1
$browsers[1] = "Brave";

echo "<br>Trình duyệt thứ hai sau khi thay đổi là: " . $browsers[1]; // Brave
?>

4. Cách duyệt mảng tuần tự

Làm thế nào để hiển thị tất cả các phần tử trong một mảng? Chúng ta sẽ sử dụng vòng lặp.

a. Dùng vòng lặp for

Đây là cách làm rất phổ biến, kết hợp với hàm count() để lấy tổng số phần tử của mảng.

<?php
$browsers = ["Chrome", "Firefox", "Safari", "Edge", "Opera"];
$soLuong = count($browsers); // Hàm count() trả về 5

echo "<h3>Danh sách các trình duyệt:</h3>";
echo "<ul>";
for ($i = 0; $i < $soLuong; $i++) {
    echo "<li>" . $browsers[$i] . "</li>";
}
echo "</ul>";
?>

b. Dùng vòng lặp foreach (Đơn giản hơn)

Vòng lặp foreach được sinh ra để làm việc với mảng, cú pháp của nó đơn giản và dễ đọc hơn rất nhiều. Chúng ta sẽ tìm hiểu kỹ hơn ở phần sau, nhưng đây là ví dụ:

<?php
$browsers = ["Chrome", "Firefox", "Safari", "Edge", "Opera"];

echo "<ul>";
foreach ($browsers as $browser) {
    echo "<li>" . $browser . "</li>";
}
echo "</ul>";
?>

Phần 3: Mảng Kết Hợp (Associative Arrays)

Trong mảng tuần tự, chúng ta phải nhớ rằng 0 là "Chrome", 1 là "Firefox",... Điều này không trực quan lắm. Mảng kết hợp trong PHP giải quyết vấn đề này bằng cách cho phép chúng ta sử dụng các chuỗi ký tự có ý nghĩa (named keys) làm khóa thay vì các con số.

1. Cách tạo mảng kết hợp trong PHP

Chúng ta sử dụng cú pháp key => value để định nghĩa các cặp phần tử.

<?php
// Tạo một mảng lưu thông tin của một người dùng
$userInfo = [
    "ho_ten" => "Nguyễn Văn An",
    "email" => "nguyenvanan@example.com",
    "tuoi" => 28,
    "thanh_pho" => "Hà Nội"
];

// Cách viết với hàm array()
$userInfo_old = array(
    "ho_ten" => "Nguyễn Văn An",
    "email" => "nguyenvanan@example.com"
);
?>

2. Cách truy cập các phần tử

Tương tự như mảng tuần tự, nhưng thay vì dùng chỉ mục số, chúng ta dùng tên khóa (key) mà chúng ta đã định nghĩa.

<?php
$userInfo = [
    "ho_ten" => "Nguyễn Văn An",
    "email" => "nguyenvanan@example.com",
    "tuoi" => 28
];

echo "Xin chào, " . $userInfo["ho_ten"]; // Kết quả: Xin chào, Nguyễn Văn An
echo "<br>";
echo "Email của bạn là: " . $userInfo["email"]; // Kết quả: Email của bạn là: nguyenvana@example.com
?>

Cách này rõ ràng và dễ hiểu hơn nhiều so với $userInfo[0].

3. Cách duyệt mảng kết hợp

Làm thế nào để duyệt mảng kết hợp trong PHP? Vòng lặp foreach là công cụ hoàn hảo cho việc này. Nó cho phép bạn lấy ra cả key và value trong mỗi lần lặp.

<?php
$userInfo = [
    "Họ và tên" => "Nguyễn Văn An",
    "Email" => "nguyenvanan@example.com",
    "Tuổi" => 28,
    "Thành phố" => "Hà Nội"
];

echo "<h3>Thông tin chi tiết:</h3>";
foreach ($userInfo as $key => $value) {
    echo "<strong>" . $key . ":</strong> " . $value . "<br>";
}
?>
 

Phần 4: Mảng Đa Chiều (Multidimensional Arrays)

Mảng đa chiều trong PHP là gì? Đơn giản, đó là một mảng mà mỗi phần tử của nó lại là một mảng khác. Bạn có thể hình dung nó giống như một bảng tính Excel, có nhiều hàng và mỗi hàng lại có nhiều cột.

Mảng đa chiều cực kỳ hữu ích để lưu trữ các cấu trúc dữ liệu phức tạp, ví dụ như một danh sách người dùng mà mỗi người dùng lại có nhiều thông tin (họ tên, email, tuổi,...).

1. Cách tạo mảng đa chiều

Hãy xem ví dụ về một mảng chứa danh sách 3 người dùng:

<?php
$users = [
    [ // Phần tử thứ nhất (index 0), là một mảng kết hợp
        "ho_ten" => "Nguyễn Văn An",
        "email" => "an.nv@example.com",
        "tuoi" => 28
    ],
    [ // Phần tử thứ hai (index 1)
        "ho_ten" => "Trần Thị Bình",
        "email" => "binh.tt@example.com",
        "tuoi" => 25
    ],
    [ // Phần tử thứ ba (index 2)
        "ho_ten" => "Lê Văn Cường",
        "email" => "cuong.lv@example.com",
        "tuoi" => 32
    ]
];
?>

Ở đây, $users là một mảng tuần tự. Mỗi phần tử của $users (ví dụ $users[0]) lại là một mảng kết hợp chứa thông tin của một người dùng.

2. Cách truy cập các phần tử

Để truy cập vào các phần tử bên trong, chúng ta sử dụng hai cặp dấu ngoặc vuông [][]. Cặp thứ nhất để chọn phần tử của mảng cha, cặp thứ hai để chọn phần tử của mảng con.

<?php
// ... (đoạn code khai báo mảng $users ở trên) ...

// Lấy email của người dùng thứ hai (index 1)
echo $users[1]["email"]; // Kết quả: binh.tt@example.com

echo "<br>";

// Lấy tuổi của người dùng thứ ba (index 2)
echo $users[2]["tuoi"]; // Kết quả: 32
?>

3. Cách duyệt mảng đa chiều

Chúng ta sẽ cần dùng đến vòng lặp lồng nhau, thường là một vòng foreach lồng bên trong một foreach khác.

<?php
// ... (đoạn code khai báo mảng $users ở trên) ...

echo "<h1>Danh sách người dùng</h1>";
echo "<table border='1' cellpadding='5' cellspacing='0'>";
echo "<tr><th>Họ tên</th><th>Email</th><th>Tuổi</th></tr>";

// Vòng lặp ngoài duyệt qua từng người dùng
foreach ($users as $user) {
    echo "<tr>";
    // Vòng lặp trong duyệt qua thông tin của từng người dùng
    echo "<td>" . $user["ho_ten"] . "</td>";
    echo "<td>" . $user["email"] . "</td>";
    echo "<td>" . $user["tuoi"] . "</td>";
    echo "</tr>";
}

echo "</table>";
?>

Phần 5: Các hàm xử lý mảng trong PHP quan trọng nhất

PHP cung cấp một kho tàng các hàm có sẵn để thao tác với mảng. Việc nắm vững các hàm này sẽ giúp bạn tiết kiệm rất nhiều thời gian và công sức.

Dưới đây là các hàm xử lý mảng trong PHP mà bạn sẽ sử dụng thường xuyên nhất:

Thao tác với phần tử

  • count($array): Đếm số phần tử trong mảng.
  • array_push($array, $value1, ...): Thêm một hoặc nhiều phần tử vào cuối mảng.
  • array_pop($array): Lấy và xóa phần tử cuối cùng của mảng.
  • array_unshift($array, $value1, ...): Thêm một hoặc nhiều phần tử vào đầu mảng.
  • array_shift($array): Lấy và xóa phần tử đầu tiên của mảng.

Tìm kiếm và kiểm tra

  • in_array($needle, $haystack): Kiểm tra xem một giá trị ($needle) có tồn tại trong mảng ($haystack) hay không.
  • array_key_exists($key, $array): Kiểm tra xem một khóa ($key) có tồn tại trong mảng hay không.
  • array_search($needle, $haystack): Tìm kiếm một giá trị và trả về khóa tương ứng của nó.

Sắp xếp mảng

  • sort($array): Sắp xếp mảng tuần tự theo giá trị, tăng dần.
  • rsort($array): Sắp xếp mảng tuần tự theo giá trị, giảm dần.
  • asort($array): Sắp xếp mảng kết hợp theo giá trị, giữ nguyên khóa.
  • ksort($array): Sắp xếp mảng kết hợp theo khóa.

Chuyển đổi và thao tác khác

  • implode($glue, $array): Nối các phần tử của mảng thành một chuỗi, ngăn cách bởi $glue.
  • explode($delimiter, $string): Tách một chuỗi thành một mảng dựa trên ký tự phân cách $delimiter.
  • array_merge($array1, $array2, ...): Gộp nhiều mảng lại thành một.
  • array_keys($array): Trả về một mảng chứa tất cả các khóa của mảng ban đầu.
  • array_values($array): Trả về một mảng chứa tất cả các giá trị của mảng ban đầu.

Kết luận

Mảng là một công cụ vô cùng mạnh mẽ và linh hoạt trong PHP. Chúng ta đã cùng nhau đi qua một hành trình dài, từ những khái niệm cơ bản nhất đến các kỹ thuật phức tạp hơn:

  • Mảng tuần tự dùng chỉ mục số, tuyệt vời cho các danh sách đơn giản.
  • Mảng kết hợp dùng khóa tự đặt, giúp code dễ đọc và có ý nghĩa hơn.
  • Mảng đa chiều cho phép lưu trữ các cấu trúc dữ liệu phức tạp.
  • Và đừng quên kho tàng hàm xử lý mảng có sẵn giúp bạn thao tác dữ liệu một cách chuyên nghiệp.

Cách tốt nhất để thực sự hiểu mảng là bắt tay vào thực hành. Hãy thử tạo một mảng đa chiều lưu danh sách các khóa học, mỗi khóa học có tên, giảng viên và số giờ học. Sau đó, hãy thử dùng foreach để hiển thị chúng ra một bảng HTML.

Trong bài học tiếp theo, chúng ta sẽ khám phá sâu hơn về một kiểu dữ liệu mà chúng ta đã sử dụng rất nhiều: "Xử lý chuỗi (String) và các hàm thông dụng".

Kelvin Zeng

Senior Website Developer

👨‍💻 Senior PHP Developer, hiện đảm nhận vai trò Techlead. Tôi có kinh nghiệm làm việc trong môi trường công ty Nhật Bản, từng tham gia thiết kế tài liệu kỹ thuật (Basic Design, Detail Design) và lập kế hoạch dự án với vai trò như một Project Lead. Trong sự nghiệp, tôi đã tham gia xây dựng và triển khai nhiều hệ thống E-commerce cũng như làm việc với nhiều framework khác nhau. Ngoài lập trình, tôi quan tâm đến SEO, automation và marketing, đặc biệt yêu thích việc phát triển các công cụ giúp tối ưu công việc. Tôi luôn sẵn sàng chia sẻ kiến thức, đồng hành cùng đồng đội để nâng cao chuyên môn và đạt được những mục tiêu lớn hơn.