Xử lý dữ liệu dạng bảng với mảng đa chiều trong PHP
PHP Tutorial | by
Rất nhiều thông tin mà chúng ta cần quản lý có cấu trúc phức tạp hơn, thường ở dạng bảng hoặc ma trận, với các hàng và cột riêng biệt. Hãy nghĩ về một bảng điểm học sinh với các cột "Tên", "Tuổi", "Điểm Toán", "Điểm Văn", hoặc một danh mục sản phẩm với "Mã sản phẩm", "Tên sản phẩm", "Giá", "Số lượng tồn kho". Làm thế nào để lưu trữ và thao tác với những dữ liệu có tổ chức như vậy trong PHP?
Câu trả lời nằm ở mảng đa chiều (multidimensional arrays). Thay vì chỉ là một "hộp chứa" các giá trị đơn lẻ, mảng đa chiều là một "hộp chứa các hộp khác", cho phép bạn tạo ra cấu trúc dữ liệu tương tự như một bảng tính hoặc cơ sở dữ liệu thu nhỏ ngay trong mã PHP của mình. Điều này mở ra khả năng quản lý dữ liệu một cách có hệ thống, giúp bạn dễ dàng truy cập, duyệt, thêm, sửa hoặc xóa thông tin theo cách trực quan hơn. Trong bài viết này, mình sẽ cùng tìm hiểu cách tạo, truy cập và thao tác hiệu quả với mảng đa chiều, đặt nền tảng vững chắc cho việc xử lý các tập dữ liệu phức tạp trong các dự án PHP của bạn.
Tạo và Truy Cập Mảng Đa Chiều trong PHP
Cấu Trúc Cơ Bản Của Mảng Đa Chiều
Về cơ bản, một mảng đa chiều là một mảng mà mỗi phần tử của nó lại là một mảng khác. Hãy hình dung nó giống như một bảng tính Excel, nơi mỗi hàng là một mảng con và các ô trong hàng đó là các phần tử của mảng con.
Mảng đa chiều có thể có nhiều cấp độ lồng nhau (ví dụ: mảng chứa mảng, mảng đó lại chứa mảng khác, v.v.), nhưng phổ biến nhất là mảng hai chiều, mô phỏng một bảng dữ liệu.
Cấu trúc này có thể là:
-
Mảng có chỉ số lồng nhau (Indexed Arrays Nested): Mảng chính có chỉ số số nguyên, và mỗi phần tử con của nó cũng là một mảng có chỉ số số nguyên.
$bang_so = [ [1, 2, 3], // Hàng 0 [4, 5, 6], // Hàng 1 [7, 8, 9] // Hàng 2 ];
Mảng kết hợp lồng nhau (Associative Arrays Nested): Mảng chính có thể là mảng kết hợp hoặc mảng có chỉ số, nhưng các phần tử con của nó là các mảng kết hợp, thường dùng để biểu diễn các "bản ghi" dữ liệu.
$danh_sach_nguoi = [ "nguoi1" => ["ten" => "An", "tuoi" => 30], "nguoi2" => ["ten" => "Binh", "tuoi" => 25] ];
Kết hợp cả hai: Đây là cấu trúc rất phổ biến, nơi mảng chính là mảng có chỉ số (mỗi hàng là một phần tử), và mỗi phần tử (hàng) lại là một mảng kết hợp (biểu diễn các cột dữ liệu).
$danh_sach_san_pham = [ ["ma" => "SP001", "ten" => "Áo thun", "gia" => 150000], // Hàng 0 ["ma" => "SP002", "ten" => "Quần jean", "gia" => 300000] // Hàng 1 ];
Tạo Mảng Đa Chiều
Bạn có thể tạo mảng đa chiều bằng cách khai báo trực tiếp các mảng con bên trong mảng chính.
-
Cú pháp khai báo trực tiếp:
$ten_mang_da_chieu = [ [gia_tri_hang_0_cot_0, gia_tri_hang_0_cot_1, ...], [gia_tri_hang_1_cot_0, gia_tri_hang_1_cot_1, ...], // ... và cứ thế tiếp tục ];
Hoặc với mảng kết hợp lồng nhau:
$ten_mang_da_chieu = [ "key_hang_0" => ["key_cot_0" => gia_tri, "key_cot_1" => gia_tri, ...], "key_hang_1" => ["key_cot_0" => gia_tri, "key_cot_1" => gia_tri, ...], // ... ];
Ví dụ minh họa:
<?php echo "<h3>Tạo Mảng Đa Chiều</h3>"; // Ví dụ 1: Tạo danh sách học sinh (mảng chỉ số chứa mảng kết hợp) // Mỗi phần tử của mảng $students là một mảng kết hợp chứa thông tin của một học sinh $students = [ [ "name" => "Nguyễn Văn An", "age" => 15, "math_score" => 8.5, "literature_score" => 7.0 ], [ "name" => "Trần Thị Bình", "age" => 16, "math_score" => 9.0, "literature_score" => 8.5 ], [ "name" => "Lê Văn Cường", "age" => 15, "math_score" => 7.5, "literature_score" => 9.0 ] ]; echo "Danh sách học sinh:<br>"; echo "<pre>"; print_r($students); echo "</pre>"; echo "<hr>"; // Ví dụ 2: Tạo bảng sản phẩm (mảng chỉ số chứa mảng kết hợp) // Mỗi phần tử của mảng $products là một mảng kết hợp chứa thông tin của một sản phẩm $products = [ [ "id" => "SP001", "name" => "Áo phông nam", "price" => 120000, "stock" => 150 ], [ "id" => "SP002", "name" => "Quần jean nữ", "price" => 350000, "stock" => 80 ], [ "id" => "SP003", "name" => "Giày thể thao", "price" => 700000, "stock" => 50 ] ]; echo "Bảng sản phẩm:<br>"; echo "<pre>"; print_r($products); echo "</pre>"; ?>
Truy Cập Phần Tử Trong Mảng Đa Chiều
Để truy cập một phần tử cụ thể trong mảng đa chiều, bạn cần sử dụng nhiều cặp dấu ngoặc vuông [][]
, mỗi cặp tương ứng với một cấp độ lồng nhau của mảng. Thứ tự các cặp dấu ngoặc vuông sẽ theo thứ tự từ cấp độ ngoài cùng vào trong cùng.
-
Ví dụ minh họa:
<?php echo "<h3>Truy Cập Phần Tử Trong Mảng Đa Chiều</h3>"; // Tiếp tục với mảng $students và $products đã tạo ở trên // Lấy tên học sinh thứ hai (học sinh ở chỉ số 1) // $students[1] là mảng của học sinh thứ hai // ["name"] là khóa để lấy tên từ mảng đó $secondStudentName = $students[1]["name"]; echo "Tên học sinh thứ hai là: " . $secondStudentName . "<br>"; // Output: Trần Thị Bình echo "<br>"; // Lấy điểm toán của học sinh đầu tiên (học sinh ở chỉ số 0) $firstStudentMathScore = $students[0]["math_score"]; echo "Điểm toán của học sinh đầu tiên là: " . $firstStudentMathScore . "<br>"; // Output: 8.5 echo "<hr>"; // Lấy giá của sản phẩm có mã "SP003" (giày thể thao) // Để lấy được giá, chúng ta cần duyệt qua mảng sản phẩm để tìm đúng sản phẩm có ID "SP003" $priceOfSP003 = "Không tìm thấy"; foreach ($products as $product) { if ($product["id"] === "SP003") { $priceOfSP003 = $product["price"]; break; // Tìm thấy rồi thì thoát vòng lặp } } echo "Giá của sản phẩm SP003 là: " . number_format($priceOfSP003) . " VND<br>"; // Output: 700,000 VND echo "<br>"; // Lấy số lượng tồn kho của sản phẩm thứ nhất (Áo phông nam) $stockOfFirstProduct = $products[0]["stock"]; echo "Số lượng tồn kho của Áo phông nam là: " . $stockOfFirstProduct . "<br>"; // Output: 150 ?>
Như bạn thấy, việc sử dụng các cặp dấu ngoặc vuông liên tiếp giúp bạn dễ dàng "điều hướng" sâu vào bên trong mảng đa chiều để truy cập đúng phần tử mình cần, giống như việc xác định hàng và cột trong một bảng
Duyệt (Lặp) Qua Mảng Đa Chiều trong PHP
Để xử lý hoặc hiển thị dữ liệu từ mảng đa chiều, bạn cần "duyệt" qua từng phần tử của nó. Vì mảng đa chiều bao gồm các mảng lồng nhau, bạn sẽ cần sử dụng các vòng lặp lồng nhau để truy cập đến tất cả các cấp độ của dữ liệu.
Sử Dụng Vòng Lặp foreach
Lồng Nhau (Phổ Biến Nhất)
Vòng lặp foreach
là cách trực quan và dễ đọc nhất để duyệt qua mảng, đặc biệt là khi làm việc với mảng kết hợp hoặc khi bạn không cần quan tâm đến chỉ số/khóa số. Với mảng đa chiều, bạn sẽ dùng foreach
lồng vào nhau:
-
Vòng
foreach
bên ngoài: Để duyệt qua các hàng (tức là các mảng con) trong mảng đa chiều chính. -
Vòng
foreach
bên trong: Để duyệt qua các cột (tức là các phần tử bên trong mỗi mảng con). -
Minh họa cách hiển thị dữ liệu dạng bảng:
<?php echo "<h3>1. Sử Dụng Vòng Lặp `foreach` Lồng Nhau</h3>"; // Tiếp tục với mảng $students đã tạo $students = [ [ "name" => "Nguyễn Văn An", "age" => 15, "math_score" => 8.5, "literature_score" => 7.0 ], [ "name" => "Trần Thị Bình", "age" => 16, "math_score" => 9.0, "literature_score" => 8.5 ], [ "name" => "Lê Văn Cường", "age" => 15, "math_score" => 7.5, "literature_score" => 9.0 ] ]; echo "<h4>Danh Sách Học Sinh</h4>"; echo "<table border='1' cellpadding='5' cellspacing='0'>"; echo "<thead><tr><th>Tên</th><th>Tuổi</th><th>Điểm Toán</th><th>Điểm Văn</th></tr></thead>"; echo "<tbody>"; // Vòng lặp bên ngoài: Duyệt qua từng học sinh (từng hàng) foreach ($students as $student) { echo "<tr>"; // Vòng lặp bên trong: Duyệt qua từng thông tin của học sinh (từng cột) foreach ($student as $key => $value) { echo "<td>" . $value . "</td>"; } echo "</tr>"; } echo "</tbody>"; echo "</table>"; echo "<hr>"; // Ví dụ khác: Duyệt qua mảng sản phẩm $products = [ [ "id" => "SP001", "name" => "Áo phông nam", "price" => 120000, "stock" => 150 ], [ "id" => "SP002", "name" => "Quần jean nữ", "price" => 350000, "stock" => 80 ], [ "id" => "SP003", "name" => "Giày thể thao", "price" => 700000, "stock" => 50 ] ]; echo "<h4>Danh Sách Sản Phẩm</h4>"; echo "<table border='1' cellpadding='5' cellspacing='0'>"; echo "<thead><tr><th>ID</th><th>Tên SP</th><th>Giá (VND)</th><th>Tồn kho</th></tr></thead>"; echo "<tbody>"; foreach ($products as $product) { echo "<tr>"; echo "<td>" . $product['id'] . "</td>"; echo "<td>" . $product['name'] . "</td>"; echo "<td>" . number_format($product['price']) . "</td>"; // Định dạng tiền tệ echo "<td>" . $product['stock'] . "</td>"; echo "</tr>"; } echo "</tbody>"; echo "</table>"; ?>
Sử Dụng Vòng Lặp for
và foreach
Kết Hợp (Cho Mảng Có Chỉ Số)
Khi mảng đa chiều của bạn là một mảng có chỉ số lồng nhau (tức là cả hàng và cột đều có thể truy cập bằng chỉ số số), bạn có thể sử dụng vòng lặp for
hoặc kết hợp for
và foreach
. Cách này hữu ích khi bạn cần truy cập phần tử theo chỉ số cụ thể hoặc cần biết tổng số hàng/cột.
-
Vòng
for
bên ngoài: Duyệt qua các hàng bằng chỉ số. -
Vòng
for
hoặcforeach
bên trong: Duyệt qua các cột bằng chỉ số hoặc giá trị. -
Ví dụ:
<?php echo "<h3>2. Sử Dụng Vòng Lặp `for` và `foreach` Kết Hợp</h3>"; // Tạo một ma trận số (mảng chỉ số lồng nhau) $matrix = [ [10, 11, 12], [20, 21, 22], [30, 31, 32] ]; echo "Ma trận số:<br>"; echo "<pre>"; print_r($matrix); echo "</pre>"; echo "<h4>Hiển Thị Ma Trận Số</h4>"; echo "<table border='1' cellpadding='5' cellspacing='0'>"; $numRows = count($matrix); // Lấy số lượng hàng echo "Số hàng: " . $numRows . "<br>"; for ($i = 0; $i < $numRows; $i++) { echo "<tr>"; // Lấy số lượng cột của hàng hiện tại (đảm bảo không bị lỗi nếu các hàng có số cột khác nhau) $numCols = count($matrix[$i]); echo "Số cột trong hàng " . $i . ": " . $numCols . "<br>"; for ($j = 0; $j < $numCols; $j++) { echo "<td>" . $matrix[$i][$j] . "</td>"; // Truy cập bằng [hàng][cột] } echo "</tr>"; } echo "</table>"; echo "<hr>"; // Ví dụ kết hợp `for` (hàng) và `foreach` (cột) echo "<h4>Hiển Thị Danh Sách Học Sinh (for & foreach)</h4>"; echo "<table border='1' cellpadding='5' cellspacing='0'>"; echo "<thead><tr><th>STT</th><th>Tên</th><th>Tuổi</th><th>Điểm Toán</th><th>Điểm Văn</th></tr></thead>"; echo "<tbody>"; for ($i = 0; $i < count($students); $i++) { $student = $students[$i]; // Lấy ra mảng con của học sinh hiện tại echo "<tr>"; echo "<td>" . ($i + 1) . "</td>"; // Số thứ tự echo "<td>" . $student['name'] . "</td>"; echo "<td>" . $student['age'] . "</td>"; echo "<td>" . $student['math_score'] . "</td>"; echo "<td>" . $student['literature_score'] . "</td>"; echo "</tr>"; } echo "</tbody>"; echo "</table>"; ?>
Cả hai phương pháp đều hiệu quả, nhưng foreach
thường được ưu tiên vì tính dễ đọc và gọn gàng hơn, đặc biệt khi làm việc với mảng kết hợp hoặc khi cấu trúc mảng có thể không đồng nhất về số lượng phần tử trong mỗi mảng con.
Thêm, Sửa, Xóa Phần Tử Trong Mảng Đa Chiều trong PHP
Việc quản lý dữ liệu dạng bảng không chỉ dừng lại ở việc tạo và duyệt. Trong các ứng dụng thực tế, bạn sẽ thường xuyên cần cập nhật thông tin bằng cách thêm các mục mới, sửa đổi dữ liệu hiện có hoặc loại bỏ các mục không còn cần thiết.
Thêm Phần Tử/Hàng Mới
Để thêm một hàng (một bản ghi hoặc một mảng con) vào mảng đa chiều, bạn có thể sử dụng cú pháp thêm phần tử vào cuối mảng tương tự như mảng một chiều.
-
Cách thức hoạt động: Bạn chỉ cần gán một mảng con mới vào vị trí tiếp theo trong mảng chính.
-
Ví dụ: Thêm một học sinh mới vào danh sách.
<?php echo "<h3>1. Thêm Phần Tử/Hàng Mới</h3>"; $students = [ ["name" => "Nguyễn Văn An", "age" => 15, "math_score" => 8.5], ["name" => "Trần Thị Bình", "age" => 16, "math_score" => 9.0] ]; echo "Danh sách học sinh ban đầu:<br>"; echo "<pre>"; print_r($students); echo "</pre>"; // Thêm một học sinh mới vào cuối danh sách $students[] = ["name" => "Lê Văn Cường", "age" => 15, "math_score" => 7.5]; echo "Danh sách học sinh sau khi thêm 'Lê Văn Cường':<br>"; echo "<pre>"; print_r($students); echo "</pre>"; echo "<hr>"; // Ví dụ khác: Thêm sản phẩm mới vào danh sách sản phẩm $products = [ ["id" => "SP001", "name" => "Áo phông", "price" => 120000], ["id" => "SP002", "name" => "Quần jean", "price" => 350000] ]; echo "Danh sách sản phẩm ban đầu:<br>"; echo "<pre>"; print_r($products); echo "</pre>"; // Thêm một sản phẩm mới $products[] = ["id" => "SP003", "name" => "Giày thể thao", "price" => 700000]; echo "Danh sách sản phẩm sau khi thêm 'Giày thể thao':<br>"; echo "<pre>"; print_r($products); echo "</pre>"; ?>
Sửa Giá Trị Của Một Phần Tử
Để sửa đổi một giá trị cụ thể trong mảng đa chiều, bạn cần truy cập chính xác đến phần tử đó bằng cách sử dụng các chỉ số/khóa lồng nhau, sau đó gán giá trị mới.
-
Cách thức hoạt động: Điều hướng đến vị trí của phần tử cần sửa bằng các cặp
[]
và thực hiện phép gán. -
Ví dụ: Cập nhật điểm của một học sinh, sửa giá sản phẩm.
<?php echo "<h3>2. Sửa Giá Trị Của Một Phần Tử</h3>"; $students = [ ["name" => "Nguyễn Văn An", "age" => 15, "math_score" => 8.5], ["name" => "Trần Thị Bình", "age" => 16, "math_score" => 9.0], ["name" => "Lê Văn Cường", "age" => 15, "math_score" => 7.5] ]; echo "Danh sách học sinh ban đầu:<br>"; echo "<pre>"; print_r($students); echo "</pre>"; // Cập nhật điểm toán của học sinh thứ hai (chỉ số 1) từ 9.0 lên 9.5 $students[1]["math_score"] = 9.5; echo "Danh sách học sinh sau khi cập nhật điểm toán của 'Trần Thị Bình':<br>"; echo "<pre>"; print_r($students); echo "</pre>"; echo "<hr>"; $products = [ ["id" => "SP001", "name" => "Áo phông", "price" => 120000], ["id" => "SP002", "name" => "Quần jean", "price" => 350000], ["id" => "SP003", "name" => "Giày thể thao", "price" => 700000] ]; echo "Danh sách sản phẩm ban đầu:<br>"; echo "<pre>"; print_r($products); echo "</pre>"; // Sửa giá của sản phẩm "Quần jean" (tìm theo ID hoặc duyệt) // Trong trường hợp này, giả sử chúng ta biết nó ở chỉ số 1 $products[1]["price"] = 320000; echo "Danh sách sản phẩm sau khi sửa giá 'Quần jean':<br>"; echo "<pre>"; print_r($products); echo "</pre>"; ?>
Xóa Một Phần Tử/Hàng
Để xóa một hàng (một mảng con) hoặc một phần tử cụ thể trong mảng đa chiều, bạn thường sử dụng hàm unset()
.
-
Cách thức hoạt động:
unset()
sẽ loại bỏ hoàn toàn phần tử tại chỉ số/khóa được chỉ định. -
Lưu ý quan trọng: Khi xóa một hàng trong mảng đa chiều có chỉ số (ví dụ: danh sách học sinh),
unset()
sẽ tạo ra một "khoảng trống" trong dãy chỉ số. Nếu bạn muốn các chỉ số được sắp xếp lại liên tục, bạn cần dùng thêmarray_values()
sau khiunset()
. -
Ví dụ: Xóa một học sinh khỏi danh sách.
<?php echo "<h3>3. Xóa Một Phần Tử/Hàng</h3>"; $students = [ ["name" => "Nguyễn Văn An", "age" => 15, "math_score" => 8.5], // Chỉ số 0 ["name" => "Trần Thị Bình", "age" => 16, "math_score" => 9.0], // Chỉ số 1 ["name" => "Lê Văn Cường", "age" => 15, "math_score" => 7.5] // Chỉ số 2 ]; echo "Danh sách học sinh ban đầu:<br>"; echo "<pre>"; print_r($students); echo "</pre>"; // Xóa học sinh 'Trần Thị Bình' (ở chỉ số 1) unset($students[1]); echo "Danh sách học sinh sau khi xóa 'Trần Thị Bình':<br>"; echo "<pre>"; print_r($students); echo "</pre>"; /* Output: Array ( [0] => Array ( [name] => Nguyễn Văn An [age] => 15 [math_score] => 8.5 ) [2] => Array ( [name] => Lê Văn Cường [age] => 15 [math_score] => 7.5 ) ) // Chỉ số 1 bị thiếu, tạo khoảng trống */ // Nếu bạn muốn sắp xếp lại chỉ số sau khi xóa $students = array_values($students); echo "Danh sách học sinh sau khi xóa và sắp xếp lại chỉ số:<br>"; echo "<pre>"; print_r($students); echo "</pre>"; /* Output: Array ( [0] => Array ( [name] => Nguyễn Văn An [age] => 15 [math_score] => 8.5 ) [1] => Array ( [name] => Lê Văn Cường [age] => 15 [math_score] => 7.5 ) ) // Chỉ số đã được gán lại liên tục */ echo "<hr>"; // Ví dụ: Xóa một thuộc tính của một sản phẩm $products = [ ["id" => "SP001", "name" => "Áo phông", "price" => 120000, "stock" => 150], ["id" => "SP002", "name" => "Quần jean", "price" => 350000, "stock" => 80] ]; echo "Sản phẩm đầu tiên ban đầu:<br>"; echo "<pre>"; print_r($products[0]); echo "</pre>"; // Xóa thuộc tính 'stock' của sản phẩm đầu tiên unset($products[0]["stock"]); echo "Sản phẩm đầu tiên sau khi xóa thuộc tính 'stock':<br>"; echo "<pre>"; print_r($products[0]); echo "</pre>"; /* Output: Array ( [id] => SP001 [name] => Áo phông [price] => 120000 ) */ ?>
Các Hàm Hữu Ích Khi Xử Lý Mảng Đa Chiều (Optional) trong PHP
Khi làm việc với các tập dữ liệu phức tạp dạng bảng trong PHP, có một số hàm mạnh mẽ giúp bạn thao tác với mảng đa chiều một cách hiệu quả hơn. Các hàm này giúp bạn trích xuất, biến đổi, lọc hoặc sắp xếp dữ liệu theo các tiêu chí cụ thể mà không cần viết quá nhiều vòng lặp thủ công.
array_column()
: Trích Xuất Một Cột Từ Mảng Các Mảng
Hàm array_column()
là một công cụ tuyệt vời để lấy ra tất cả các giá trị từ một cột (một khóa cụ thể) trong một mảng các mảng, tạo thành một mảng một chiều mới. Điều này rất tiện lợi khi bạn chỉ cần một danh sách các giá trị từ một trường nhất định.
-
Cách thức hoạt động: Duyệt qua từng mảng con và lấy giá trị của khóa được chỉ định.
-
Cú pháp:
array_column($input_array, $column_key, $index_key = null);
$input_array
: Mảng đa chiều bạn muốn trích xuất.$column_key
: Khóa (tên cột) mà bạn muốn lấy giá trị.$index_key
(tùy chọn): Khóa để sử dụng làm chỉ số cho mảng kết quả.
Ví dụ code minh họa:
<?php echo "<h3>1. `array_column()`: Trích Xuất Một Cột</h3>"; $students = [ ["id" => 101, "name" => "Nguyễn Văn An", "math_score" => 8.5], ["id" => 102, "name" => "Trần Thị Bình", "math_score" => 9.0], ["id" => 103, "name" => "Lê Văn Cường", "math_score" => 7.5], ]; echo "Danh sách học sinh gốc:<br>"; echo "<pre>"; print_r($students); echo "</pre>"; // Trích xuất tất cả tên học sinh $studentNames = array_column($students, 'name'); echo "Tên tất cả học sinh:<br>"; echo "<pre>"; print_r($studentNames); echo "</pre>"; /* Output: Array ( [0] => Nguyễn Văn An [1] => Trần Thị Bình [2] => Lê Văn Cường ) */ // Trích xuất điểm toán và dùng 'id' làm khóa cho mảng kết quả $studentScoresById = array_column($students, 'math_score', 'id'); echo "Điểm toán của học sinh theo ID:<br>"; echo "<pre>"; print_r($studentScoresById); echo "</pre>"; /* Output: Array ( [101] => 8.5 [102] => 9 [103] => 7.5 ) */ ?>
array_map()
và array_filter()
: Áp Dụng Hàm hoặc Lọc Dữ Liệu
Hai hàm này cực kỳ hữu ích để biến đổi hoặc lọc dữ liệu trong mảng một cách linh hoạt, đặc biệt khi kết hợp với mảng đa chiều.
array_map($callback, $array)
:
-
Cách thức hoạt động: Áp dụng một hàm callback cho từng phần tử của mảng (hoặc nhiều mảng) và trả về một mảng mới chứa các kết quả. Nó dùng để biến đổi dữ liệu.
-
Ví dụ: Thêm trạng thái "Đạt/Không đạt" dựa trên điểm số.
<?php echo "<h3>2a. `array_map()`: Biến Đổi Dữ Liệu</h3>"; $students = [ ["name" => "Nguyễn Văn An", "math_score" => 8.5], ["name" => "Trần Thị Bình", "math_score" => 4.0], // Không đạt ["name" => "Lê Văn Cường", "math_score" => 7.5], ]; echo "Điểm học sinh gốc:<br>"; echo "<pre>"; print_r($students); echo "</pre>"; // Áp dụng hàm để thêm trạng thái 'status' cho mỗi học sinh $studentsWithStatus = array_map(function($student) { $student['status'] = ($student['math_score'] >= 5.0) ? "Đạt" : "Không Đạt"; return $student; }, $students); echo "Học sinh với trạng thái Đạt/Không Đạt:<br>"; echo "<pre>"; print_r($studentsWithStatus); echo "</pre>"; /* Output: Array ( [0] => Array ( [name] => Nguyễn Văn An [math_score] => 8.5 [status] => Đạt ) [1] => Array ( [name] => Trần Thị Bình [math_score] => 4 [status] => Không Đạt ) [2] => Array ( [name] => Lê Văn Cường [math_score] => 7.5 [status] => Đạt ) ) */ ?>
array_filter($array, $callback)
:
-
Cách thức hoạt động: Lọc các phần tử của mảng bằng cách sử dụng một hàm callback. Chỉ những phần tử mà hàm callback trả về
true
mới được giữ lại trong mảng kết quả. Nó dùng để chọn lọc dữ liệu. -
Ví dụ: Lọc ra các học sinh có điểm toán từ 8.0 trở lên.
<?php echo "<h3>2b. `array_filter()`: Lọc Dữ Liệu</h3>"; $students = [ ["name" => "Nguyễn Văn An", "math_score" => 8.5], ["name" => "Trần Thị Bình", "math_score" => 9.0], ["name" => "Lê Văn Cường", "math_score" => 7.5], ]; echo "Điểm học sinh gốc:<br>"; echo "<pre>"; print_r($students); echo "</pre>"; // Lọc ra các học sinh có điểm toán từ 8.0 trở lên $highAchievers = array_filter($students, function($student) { return $student['math_score'] >= 8.0; }); echo "Học sinh đạt điểm cao (>= 8.0):<br>"; echo "<pre>"; print_r($highAchievers); echo "</pre>"; /* Output: Array ( [0] => Array ( [name] => Nguyễn Văn An [math_score] => 8.5 ) [1] => Array ( [name] => Trần Thị Bình [math_score] => 9 ) ) */ // Lưu ý: array_filter giữ nguyên chỉ số gốc. Nếu muốn chỉ số liên tục, dùng array_values() $highAchievers = array_values($highAchievers); echo "Học sinh đạt điểm cao (sau array_values):<br>"; echo "<pre>"; print_r($highAchievers); echo "</pre>"; /* Output: Array ( [0] => Array ( [name] => Nguyễn Văn An [math_score] => 8.5 ) [1] => Array ( [name] => Trần Thị Bình [math_score] => 9 ) ) */ ?>
array_multisort()
: Sắp Xếp Mảng Đa Chiều Dựa Trên Một Hoặc Nhiều Cột
Hàm này là lựa chọn tối ưu khi bạn cần sắp xếp một mảng chứa các mảng con (tức là dữ liệu dạng bảng) dựa trên giá trị của một hoặc nhiều "cột" cụ thể. Nó cho phép sắp xếp theo nhiều tiêu chí (ví dụ: sắp xếp theo điểm số, nếu điểm số bằng nhau thì sắp xếp theo tên).
Cách thức hoạt động: Lấy các "cột" mà bạn muốn sắp xếp ra các mảng riêng, sau đó truyền chúng vào array_multisort()
cùng với mảng gốc.
Cú pháp:
array_multisort($array1, $sort_order1, $sort_flags1, $array2, $sort_order2, $sort_flags2, $original_array);
$array1, $array2, ...
: Các mảng tạm chứa dữ liệu của các cột cần sắp xếp.$sort_order
(tùy chọn):SORT_ASC
(tăng dần) hoặcSORT_DESC
(giảm dần).$sort_flags
(tùy chọn):SORT_NUMERIC
,SORT_STRING
,SORT_REGULAR
.$original_array
: Mảng đa chiều gốc sẽ bị thay đổi trực tiếp.
Ví dụ code minh họa:
<?php echo "<h3>3. `array_multisort()`: Sắp Xếp Mảng Đa Chiều</h3>"; $products = [ ["name" => "Áo thun", "price" => 150000, "stock" => 50], ["name" => "Quần jean", "price" => 300000, "stock" => 20], ["name" => "Mũ lưỡi trai", "price" => 80000, "stock" => 100], ["name" => "Giày thể thao", "price" => 300000, "stock" => 30], // Giá trùng với Quần jean ]; echo "Danh sách sản phẩm gốc:<br>"; echo "<pre>"; print_r($products); echo "</pre>"; // Bước 1: Trích xuất các cột cần sắp xếp vào các mảng tạm $prices = array_column($products, 'price'); $names = array_column($products, 'name'); // Bước 2: Sắp xếp mảng gốc dựa trên các cột tạm // Sắp xếp theo giá (price) tăng dần, nếu giá bằng nhau thì sắp xếp theo tên (name) tăng dần array_multisort($prices, SORT_ASC, // Tiêu chí 1: giá tăng dần $names, SORT_ASC, // Tiêu chí 2: tên tăng dần (nếu giá bằng nhau) $products); // Áp dụng sắp xếp vào mảng $products gốc echo "Sản phẩm sau khi sắp xếp (giá tăng, tên tăng):<br>"; echo "<pre>"; print_r($products); echo "</pre>"; /* Output: Array ( [0] => Array ( [name] => Mũ lưỡi trai [price] => 80000 [stock] => 100 ) [1] => Array ( [name] => Giày thể thao [price] => 300000 [stock] => 30 ) // Giá 300000 [2] => Array ( [name] => Quần jean [price] => 300000 [stock] => 20 ) // Giá 300000, Q trước G [3] => Array ( [name] => Áo thun [price] => 150000 [stock] => 50 ) ) */ ?>
Kết bài
Việc xử lý dữ liệu dạng bảng với mảng đa chiều là một kỹ năng cốt lõi trong lập trình PHP, cho phép bạn tổ chức và thao tác với các tập dữ liệu phức tạp một cách có hệ thống và hiệu quả. Khả năng này không chỉ giúp mã của bạn gọn gàng, dễ đọc mà còn là nền tảng vững chắc để bạn làm việc với các nguồn dữ liệu lớn hơn như cơ sở dữ liệu.
Chúng ta đã cùng nhau tìm hiểu các khía cạnh quan trọng của mảng đa chiều:
-
Tạo và Truy cập: Bạn đã biết cách định nghĩa các mảng lồng nhau để biểu diễn dữ liệu dạng hàng và cột, cũng như cách sử dụng nhiều cặp dấu ngoặc vuông
[][]
để "đi sâu" vào từng phần tử cụ thể. -
Duyệt (Lặp): Vòng lặp
foreach
lồng nhau đã được chứng minh là công cụ mạnh mẽ và trực quan nhất để duyệt qua từng hàng và từng cột, giúp bạn hiển thị hoặc xử lý toàn bộ dữ liệu trong bảng. Đối với các trường hợp cụ thể, bạn cũng có thể kết hợpfor
vàforeach
. -
Thêm, Sửa, Xóa: Các thao tác cơ bản này giúp bạn duy trì tính động của dữ liệu: thêm hàng mới bằng cú pháp gán đơn giản, sửa đổi giá trị bằng cách truy cập trực tiếp, và xóa hàng hoặc thuộc tính bằng
unset()
(có thể kết hợparray_values()
nếu cần sắp xếp lại chỉ số). -
Các hàm hữu ích: Các hàm như
array_column()
,array_map()
,array_filter()
, vàarray_multisort()
là những trợ thủ đắc lực, giúp bạn trích xuất, biến đổi, lọc và sắp xếp dữ liệu trong mảng đa chiều một cách hiệu quả, giảm thiểu số lượng mã thủ công.
Nắm vững cách làm việc với mảng đa chiều sẽ mở ra nhiều cánh cửa trong các dự án PHP của bạn, từ việc xây dựng các bảng dữ liệu động trên trang web đến việc chuẩn bị dữ liệu để lưu trữ hoặc xử lý phức tạp hơn.