Menu

PHP count(): lấy độ dài của mảng

count($arr) trả về số phần tử của một mảng PHP, nên count(['a', 'b', 'c']) là 3. Tìm hiểu cách đếm mảng lồng nhau với COUNT_RECURSIVE, quan hệ giữa sizeof() và count(), cách đếm các giá trị thỏa điều kiện, và vì sao count(null) ném TypeError từ PHP 8.

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.

count($arr) trả về số phần tử của một mảng: count(['red', 'green', 'blue']) là 3. Mảng PHP không có thuộc tính length, nên count() là cách lấy độ dài hay kích thước của mảng.

count() chạy rất nhanh: PHP lưu sẵn kích thước bên trong mảng, nên đếm một triệu phần tử cũng tốn như đếm ba phần tử.

Đếm mảng nhiều chiều

Mặc định count() chỉ đếm cấp ngoài cùng. Truyền COUNT_RECURSIVE (hoặc 1) làm đối số thứ hai để đếm mọi phần tử ở mọi cấp. Bản thân các mảng lồng bên trong cũng được đếm, vì vậy tổng thường lớn hơn số giá trị ở tầng cuối.

Cả hai cách tắt trên đều giả định có đúng hai cấp. Với mảng nhiều chiều lồng sâu hơn, hãy đếm các giá trị ở tầng cuối bằng array_walk_recursive(): $n = 0; array_walk_recursive($arr, function () use (&$n) { $n++; });.

count và sizeof

sizeof() là bí danh của count(): cùng đối số, cùng kết quả. Hãy dùng count(). Đó là hàm mà gần như mọi code và tài liệu PHP đều dùng, còn sizeof gợi cho người biết C về kích thước tính bằng byte.

Đếm các giá trị thỏa điều kiện

count() không có đối số điều kiện. Hãy lọc trước rồi mới đếm: array_filter() giữ lại những phần tử mà callback của bạn chấp nhận. Để đếm số lần xuất hiện của mỗi giá trị, dùng array_count_values().

Đếm ký tự trong chuỗi

count() dành cho mảng. Với chuỗi, dùng strlen() để đếm byte hoặc mb_strlen() để đếm ký tự; hai hàm cho kết quả khác nhau ngay khi văn bản có dấu, như tiếng Việt, hoặc là tiếng Nhật. Trang strlen giải thích sự khác biệt này. Để đếm từ, hãy tách chuỗi trước.

str_word_count() coi các chữ cái ngoài ASCII là ký tự phân cách, nên naïve bị đếm thành hai từ. Tách theo dấu cách cho kết quả dễ đoán hơn với văn bản thực tế.

count() với null hoặc chuỗi sẽ ném lỗi

Từ PHP 8, count() chỉ nhận mảng và đối tượng có cài đặt Countable. Mọi giá trị khác đều ném ra TypeError, trong khi PHP 7.2 đến 7.4 trả về 0 (với null) hoặc 1 (với chuỗi hay số) kèm một cảnh báo. Nguyên nhân thường gặp là một biến đôi khi mang giá trị null, chẳng hạn một khóa bị thiếu hoặc một hàm không trả về gì.

Đặt giá trị mặc định là mảng rỗng bằng ??, và kết quả đếm là 0:

Kiểm tra mảng có rỗng không

Để hỏi "mảng này có gì bên trong không", hãy so sánh với một mảng rỗng hoặc dùng empty(). count($arr) === 0 cũng được, nhưng chỉ khi chắc chắn $arr là mảng.

empty($x) không bao giờ ném lỗi, kể cả khi $x chưa được định nghĩa hoặc là null, nên đây là cách kiểm tra an toàn hơn cho một giá trị có thể không phải mảng. Các quy tắc khác của nó (chuỗi rỗng và "0" cũng được coi là rỗng) có ở trang empty.

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

Làm sao lấy độ dài của mảng trong PHP?

Dùng count($arr). Hàm trả về số phần tử dưới dạng số nguyên, nên count([10, 20, 30]) là 3. Mảng PHP không có thuộc tính length.

count và sizeof trong PHP khác nhau thế nào?

Không khác gì cả. sizeof() là bí danh của count() và nhận cùng các đối số. Phần lớn code dùng count(), còn sizeof() có thể gây hiểu lầm với người quen C, nơi nó có nghĩa là số byte.

Làm sao đếm phần tử của mảng nhiều chiều?

count($arr) chỉ đếm cấp ngoài cùng. count($arr, COUNT_RECURSIVE) đếm mọi phần tử ở mọi cấp, và các mảng lồng bên trong cũng được tính là phần tử.

Vì sao count() ném TypeError trong PHP 8?

Từ PHP 8.0, count() chỉ nhận mảng và đối tượng có cài đặt Countable. count(null) ném ra TypeError: count(): Argument #1 ($value) must be of type Countable|array, null given, và count('abc') cũng vậy với string given. Dùng count($x ?? []) cho giá trị có thể là null, và strlen() cho chuỗi.

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