Menu

Mảng kết hợp trong PHP: cặp khóa và giá trị

Mảng kết hợp trong PHP lưu giá trị dưới các khóa do bạn đặt tên: $user = ['name' => 'Ada', 'age' => 36]; đọc bằng $user['name']. Tìm hiểu cách thêm, sửa, xóa cặp, duyệt khóa và giá trị, lấy mọi khóa hoặc giá trị, kiểm tra khóa và sắp xếp theo khóa hoặc giá trị.

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 kết hợp (associative array) lưu mỗi giá trị dưới một khóa do bạn chọn, viết dạng key => value: $user = ['name' => 'Ada', 'age' => 36];. Đọc một giá trị bằng $user['name'], và thêm hoặc sửa giá trị bằng cách gán vào khóa của nó: $user['email'] = 'ada@example.com';.

Ở các ngôn ngữ khác, cấu trúc này được gọi là từ điển (dictionary), map hay hash. Trong PHP nó chỉ là một mảng bình thường có khóa là chuỗi thay vì 0, 1, 2.

Thêm, sửa và xóa cặp

Gán vào một khóa chưa tồn tại sẽ thêm khóa đó vào cuối. Gán vào một khóa đã có sẽ thay giá trị và giữ nguyên vị trí của nó. unset() xóa một cặp.

array_push() không giúp được gì ở đây: nó chỉ nối thêm giá trị với khóa số. Để thêm nhiều cặp cùng lúc, dùng array_merge($stock, $more), khi đó giá trị mới thắng, hoặc $stock + $more, khi đó khóa có sẵn giữ giá trị cũ; trang array_merge so sánh hai cách này.

Duyệt khóa và giá trị

foreach ($array as $key => $value) đi qua các cặp theo thứ tự chúng được thêm vào. Bỏ $key => đi khi bạn chỉ cần giá trị.

Lấy mọi khóa hoặc mọi giá trị

array_keys() trả về các khóa dưới dạng danh sách thường và array_values() trả về các giá trị, cả hai đều được đánh số lại từ 0. Truyền thêm đối số thứ hai cho array_keys() thì hàm chỉ trả về những khóa chứa giá trị đó, đây là cách tìm mọi khóa ứng với một giá trị.

Với một khóa, array_search() trả về kết quả khớp đầu tiên, hoặc false khi không có. Trang array_search giải thích vì sao bạn phải so sánh kết quả đó với !== false.

Kiểm tra khóa có tồn tại không

isset($arr['key']) là cách kiểm tra thông dụng và nhanh nhất, nhưng nó trả về false khi khóa tồn tại mà chứa null. Trong trường hợp đó, array_key_exists('key', $arr) trả về true. Để đọc kèm giá trị dự phòng, toán tử ?? làm cả hai việc cùng lúc.

Sắp xếp theo khóa hoặc theo giá trị

ksort() sắp xếp theo khóa và asort() sắp xếp theo giá trị, cả hai đều giữ mỗi khóa gắn với giá trị của nó. krsort() và arsort() sắp xếp theo chiều ngược lại. Đừng dùng sort() cho mảng kết hợp: hàm này bỏ hết khóa và đánh số lại từ 0.

Tất cả các hàm này sắp xếp ngay trên mảng và trả về true, nên $sorted = ksort($arr) cho bạn true chứ không phải một mảng. Thứ tự tùy chỉnh thì dùng uasort() và uksort().

Đảo, đếm và chuyển sang JSON

Có vài dòng code ngắn mà bạn sẽ gặp đi gặp lại với dữ liệu khóa và giá trị: array_flip() đổi chỗ khóa và giá trị, array_count_values() đếm số lần xuất hiện của mỗi giá trị, còn json_encode() biến mảng thành một đối tượng JSON.

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

Đọc một khóa không có sẽ trả về null, nhưng PHP trên máy bạn còn in ra một cảnh báo:

<?php
$user = ['name' => 'Ada'];
echo $user['phone'];
Warning: Undefined array key "phone" in /var/www/html/index.php on line 3

Hãy đọc kèm giá trị mặc định bằng ??, toán tử này không bao giờ cảnh báo, hoặc kiểm tra trước bằng isset() khi trường hợp thiếu khóa cần một nhánh xử lý riêng.

Bên trong chuỗi nháy kép, hãy bọc phép tra khóa trong dấu ngoặc nhọn, "{$user['email']}". Không có ngoặc, PHP chỉ chấp nhận dạng không có nháy "$user[email]", rất dễ viết sai.

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

Làm sao tạo mảng kết hợp trong PHP?

Viết mỗi cặp dưới dạng key => value bên trong dấu ngoặc vuông: $prices = ['apple' => 1.2, 'pear' => 0.9];. Đọc một giá trị bằng $prices['apple'].

Làm sao sắp xếp mảng kết hợp theo khóa trong PHP?

Gọi ksort($arr); để sắp từ A đến Z hoặc krsort($arr); để sắp từ Z đến A. Cả hai sắp xếp ngay trên mảng, giữ mỗi giá trị đi cùng khóa của nó, và trả về true chứ không phải mảng đã sắp xếp.

Làm sao duyệt mảng kết hợp trong PHP?

Dùng foreach với cả hai biến: foreach ($prices as $fruit => $price) { echo "$fruit: $price\n"; }. Các cặp được lấy ra theo thứ tự chúng được thêm vào.

Làm sao lấy tất cả các khóa của mảng kết hợp?

array_keys($arr) trả về các khóa dưới dạng mảng chỉ số, còn array_values($arr) trả về các giá trị. array_keys($arr, $value) chỉ trả về những khóa có giá trị bằng $value.

Mảng kết hợp trong PHP có giữ thứ tự thêm vào không?

Có. Mảng PHP là ánh xạ có thứ tự, nên foreach, print_r và json_encode đều thấy các cặp theo đúng thứ tự bạn thêm vào, cho đến khi bạn sắp xếp mảng bằng ksort(), asort() hoặc một hàm tương tự.

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