Menu

Mảng đa chiều trong PHP: mảng lồng nhau và vòng lặp

Mảng đa chiều trong PHP là mảng có các phần tử là mảng, đọc bằng một cặp ngoặc vuông cho mỗi cấp: $grid[1][2] hoặc $users[0]['name']. Học cách tạo mảng lồng nhau, đọc và sửa giá trị ở sâu bên trong, lặp bằng foreach lồng nhau, tạo bảng HTML, lấy ra một cột và sắp xếp các hàng.

Trang này có trình soạn thảo chạy trực tiếp. Sửa, chạy và xem đầu ra ngay lập tức.

Mảng đa chiều (multidimensional array) là mảng có các phần tử là mảng. Bạn đọc nó bằng một cặp ngoặc vuông cho mỗi cấp: $grid[1][2] là hàng 1, cột 2, còn $users[0]['name'] là tên trong bản ghi đầu tiên.

Dạng thứ hai, một danh sách các bản ghi với các trường có tên, là dạng bạn sẽ gặp nhiều nhất: đó thường là thứ mà một truy vấn cơ sở dữ liệu, một response JSON đã giải mã hay một tệp CSV đã đọc trả về cho bạn. Mỗi bản ghi là một mảng kết hợp.

Tạo mảng lồng nhau

Bạn có thể lồng sâu bao nhiêu cấp tùy ý, và các cấp có thể trộn khóa số với khóa chuỗi. Một mảng cấu hình là ví dụ quen thuộc: các mục có tên, mỗi mục chứa các thiết lập hoặc danh sách.

Thêm hàng và giá trị lồng nhau

$rows[] = [...] thêm cả một hàng vào cuối. $arr['key'][] = $value thêm vào bên trong một danh sách lồng nhau, và PHP tự tạo mảng bên trong ở lần đầu, nên gom nhóm giá trị không cần chuẩn bị gì trước.

Duyệt mảng đa chiều

Dùng một foreach cho mỗi cấp. Với danh sách các bản ghi, một vòng lặp thường là đủ vì bạn đọc các trường theo tên. Với một lưới, vòng lặp bên trong đi qua từng ô của mỗi hàng.

Tạo bảng HTML từ một mảng

Một mảng các hàng ánh xạ thẳng sang bảng HTML: các khóa của hàng đầu tiên thành tiêu đề cột, và mỗi hàng thành một <tr>. Chạy code, tab Trang sẽ hiện bảng đã được hiển thị; đổi một giá trị hoặc thêm một hàng rồi chạy lại.

Dạng foreach (...): ... endforeach; là cùng một vòng lặp nhưng viết cho template, để HTML vẫn dễ đọc.

Lấy một cột từ tất cả các hàng

array_column() lấy một trường từ mọi hàng ra thành một danh sách phẳng. Truyền tham số thứ ba để dùng một trường khác làm khóa cho kết quả, cách này biến danh sách bản ghi thành một bảng tra cứu.

Sắp xếp các hàng theo một trường

usort() sắp xếp các hàng bằng một hàm so sánh. Toán tử spaceship <=> trả về -1, 0 hoặc 1, đúng thứ mà usort() cần. Đổi chỗ $a và $b để sắp xếp giảm dần.

count($players, COUNT_RECURSIVE) đếm 3 hàng cộng với 6 trường bên trong, vì vậy nó in ra 9.

Lỗi thường gặp: đọc một khóa sâu có thể không tồn tại

Đọc $config['cache']['ttl'] khi không có khóa cache sẽ in ra Warning: Undefined array key "cache", tiếp theo là Warning: Trying to access array offset on null cho cấp kế tiếp. Toán tử ?? kiểm tra cả chuỗi cùng lúc và không bao giờ cảnh báo, nên đó là cách an toàn để đọc các giá trị lồng nhau không bắt buộc.

Câu hỏi thường gặp

Làm sao truy cập một giá trị trong mảng đa chiều của PHP?

Thêm một cặp ngoặc vuông cho mỗi cấp: $matrix[1][0] là hàng 1, cột 0, còn $users[0]['email'] là email của người dùng đầu tiên. Mỗi cặp ngoặc đọc từ mảng mà cặp ngoặc trước trả về.

Làm sao duyệt mảng đa chiều trong PHP?

Lồng một foreach cho mỗi cấp: foreach ($rows as $row) { foreach ($row as $key => $value) { ... } }. Với một mảng các bản ghi, bạn thường chỉ cần một vòng lặp và đọc các trường theo tên: $row['name'].

Làm sao thêm phần tử vào mảng đa chiều?

Thêm cả một hàng bằng $rows[] = ['name' => 'Linus', 'age' => 54];, hoặc thêm vào bên trong một mảng lồng nhau bằng $groups['admins'][] = 'Grace';. PHP tự tạo mảng bên trong nếu khóa đó chưa tồn tại.

Làm sao tạo mảng 2 chiều toàn số 0 trong PHP?

Lồng hai lời gọi array_fill(): $grid = array_fill(0, 3, array_fill(0, 4, 0)); cho ra 3 hàng, mỗi hàng 4 số 0. Mỗi hàng là một bản sao riêng, nên $grid[0][0] = 5; chỉ thay đổi hàng đầu tiên.

Hình minh họa các ngôn ngữ lập trình của Coddy

Học lập trình cùng Coddy

Bắt đầu