array_column($rows, $column) trả về giá trị của $column từ mọi hàng trong một danh sách các hàng. Hàm này biến một bảng bản ghi thành một mảng phẳng chỉ chứa một trường, đúng thứ bạn cần trước khi dùng implode, in_array, array_sum hay array_search.
Các hàng có thể đến từ bất cứ đâu: một response JSON đã được decode, một tệp CSV, hoặc một truy vấn cơ sở dữ liệu trả về mảng gồm các mảng kết hợp.
Dùng index key để tạo cặp key value
Đối số thứ ba chỉ định một trường mà giá trị của nó sẽ thành khóa của từng kết quả. array_column($users, 'name', 'id') là cách thường dùng để dựng bảng tra cứu từ id sang tên, chẳng hạn cho một danh sách <select>.
Nếu hai hàng có cùng giá trị index, hàng sau sẽ ghi đè hàng trước.
Đánh chỉ mục cả hàng theo id với null
Truyền null làm cột để giữ nguyên từng hàng, với khóa mới lấy từ trường index. Khi đó, tìm một hàng theo id chỉ là truy cập khóa trực tiếp thay vì một vòng lặp.
Dựng chỉ mục một lần, sau đó mọi lần tra cứu đều có kết quả ngay, điều này quan trọng khi bạn tra nhiều id trong một vòng lặp.
Tìm một hàng bằng array_column và array_search
Để biết hàng nào có một giá trị cho trước, hãy tìm trong cột rồi dùng vị trí nhận được. Kiểm tra kết quả bằng !== false, vì một kết quả khớp ở hàng đầu tiên sẽ trả về 0.
Cách này dựa vào việc $users có các khóa 0, 1, 2, vì array_column trả về một list. Nếu mảng đã được lọc và có khóa bị khuyết, hãy gọi array_values($users) trước. Trang array_search giải thích chi tiết cái bẫy false với 0.
Tính tổng, đếm hoặc tính trung bình một cột
array_column kết hợp rất tốt với các hàm toán học: lấy trường ra rồi cộng lại.
Với một giá trị được tính từ nhiều trường, như số lượng nhân giá, công cụ phù hợp là array_map, như ở dòng cuối cùng.
array_column với đối tượng
Với một danh sách đối tượng, array_column đọc các thuộc tính public. Nó không nhìn thấy các thuộc tính private và protected.
Lần gọi thứ hai trả về mảng rỗng: password là private, nên mọi đối tượng đều bị bỏ qua.
Hàng thiếu trường sẽ bị bỏ qua
array_column không điền giá trị thay thế cho hàng thiếu trường. Kết quả có thể ngắn hơn đầu vào, nên vị trí của nó không còn khớp với các hàng.
Kết quả đầu tiên có hai số điện thoại mà không có dấu hiệu nào cho thấy Bob không có số. Khi dùng tên làm index key, bạn sẽ thấy số nào của ai, và đây là cách an toàn hơn mỗi khi có hàng có thể thiếu trường.
Câu hỏi thường gặp
Hàm array_column trong PHP làm gì?
Hàm này nhận một danh sách các hàng (mảng hoặc đối tượng) và trả về giá trị của một trường từ mỗi hàng: array_column($users, 'email') cho ra một mảng phẳng chứa các email. Những hàng không có trường đó sẽ bị bỏ qua.
Làm sao tạo mảng key value từ các hàng dữ liệu?
Truyền trường làm khóa vào đối số thứ ba: array_column($users, 'name', 'id') trả về [id => name, ...]. Truyền null làm đối số thứ hai, array_column($users, null, 'id'), để giữ nguyên cả hàng và đánh chỉ mục theo id.
array_column làm gì khi một hàng thiếu trường cần lấy?
Hàm bỏ qua hàng đó, nên array_column($people, 'phone') có thể trả về ít giá trị hơn số hàng và vị trí không còn khớp nhau. Hãy thêm index key, array_column($people, 'phone', 'name'), để biết mỗi giá trị đến từ hàng nào.
array_column có dùng được với đối tượng không?
Có. Với một mảng các đối tượng, hàm này đọc các thuộc tính public, và cả các thuộc tính được cung cấp qua __get khi lớp có định nghĩa __isset. Thuộc tính private và protected bị bỏ qua.