متد count() در PHP
تابع count() یکی از پرکاربردترین توابع PHP برای شمارش عناصر آرایهها یا اشیایی است که رابط Countable را پیادهسازی کردهاند. در این مقاله به شکل دقیق رفتار تابع، پارامترها، режِیمها، موارد مرزی و نکات عملکردی را بررسی میکنیم و مثالهای عملی و بهینهسازیهای رایج را نشان میدهیم.
امضای تابع و بازگشتی که باید انتظار داشته باشید
تابع به صورت زیر تعریف میشود:
| امضا | توضیح |
|---|---|
count(mixed $value, int $mode = COUNT_NORMAL): int | شمارش عناصر از مقدار ورودی؛ در حالت عادی یا بازگشتی (recursive) |
ثوابت مرتبط: COUNT_NORMAL (پیشفرض) و COUNT_RECURSIVE (یا COUNT_RECURSIVE برای شمارش عمیق).
رفتار پایهای
- اگر مقدار آرایه باشد، تعداد عناصر آرایه بازگردانده میشود.
- اگر مقدار شیء باشد و آن کلاس
Countableرا پیادهسازی کرده باشد، متدcount()آن اجرا میشود و نتیجه بازگردانده میشود. - برای مقادیر
nullمعمولاً 0 برگردانده میشود. - از PHP 7.2 به بعد، فراخوانی
count()روی مقادیری که قابلشمارش نیستند میتواند هشدار تولید کند؛ از PHP 7.3 تابعis_countable()برای چک کردن ایمن معرفی شده است. sizeof()معادلcount()است (آلیاس).
مثال ساده با آرایه
<?php
$students = ['Ali', 'Sara', 'Mina'];
echo count($students); // 3
echo count([]); // 0
?>
در این مثال ساده تعداد اعضای آرایه با count() محاسبه شده است. برای آرایه خالی مقدار صفر بازگردانده میشود.
COUNT_RECURSIVE — شمارش عناصر تو در تو
<?php
$data = [
'a',
['b1', 'b2'],
['c' => ['c1','c2','c3']]
];
echo count($data); // 3 (فقط عناصر سطح اول)
echo count($data, COUNT_RECURSIVE); // تعداد همه عناصر در سطوح تو در تو
?>
وقتی از COUNT_RECURSIVE استفاده میکنید، تمام عناصر داخلیِ آرایههای تو در تو نیز شمرده میشوند. توجه کنید که عنصرهای آرایهٔ تو در تو خود نیز بهعنوان یک عنصر سطح اول حساب میشوند؛ یعنی عدد نهایی مجموع همهٔ گرهها خواهد بود.
استفاده با اشیاء — Countable
<?php
class MyCollection implements Countable {
private $items = [];
public function add($v){ $this->items[] = $v; }
public function count(): int { return count($this->items); }
}
$c = new MyCollection();
$c->add(1);
$c->add(2);
echo count($c); // 2
?>
اگر کلاس شما رابط Countable را پیادهسازی کند، تابع count() فراخوانی متد count() تعریفشده در کلاس را انجام میدهد و مقدار بازگشتی آن را برمیگرداند. این روش به شما امکان کنترل دقیق روی رفتار شمارش اشیاء را میدهد.
موارد مرزی و هشدارها
- فراخوانی
count()روی مقدارnullمعمولاً صفر برمیگرداند، اما بهتر است قبل از شمارش ازis_array()یاis_countable()استفاده کنید تا از هشدارها جلوگیری شود. - اگر روی متغیری که آرایه نیست و شیء Countable هم نیست،
count()اجرا شود ممکن است در نسخههای جدیدتر PHP هشدار برگردانده شود. - برای انواعی مثل boolean یا resource نباید از
count()استفاده کرد؛ ابتدا نوع را بررسی کنید.
مثال ایمن با is_countable
<?php
$value = getSomething();
if (is_countable($value)) {
$n = count($value);
} else {
$n = 0; // یا منطق دلخواه
}
?>
تابع is_countable() (از PHP 7.3) بهترین راه برای اجتناب از هشدارهای احتمالی و اطمینان از اینکه متغیر قابلشمارش است، میباشد.
بهینهسازی عملکرد — نمونه کاربردی
یکی از اشتباهات رایج استفاده از count() داخل حلقه است که در هر تکرار مجدداً محاسبه میشود و موجب کاهش کارایی میگردد. بهتر است مقدار شمارش را قبل از حلقه ذخیره کنید:
<?php
// بد
for ($i = 0; $i < count($arr); $i++) {
// کار با $arr[$i]
}
// خوب (بهینه)
$len = count($arr);
for ($i = 0; $i < $len; $i++) {
// کار با $arr[$i]
}
?>
در مثال بالا با ذخیرهٔ نتیجه count($arr) در متغیری مثل $len از محاسبهٔ مکرر جلوگیری میکنیم و کارایی حلقه افزایش مییابد، مخصوصاً وقتی آرایه بزرگ داشته باشیم.
مثالهای عملی و نکات تکمیلی
- آرایهٔ انجمنی (associative):
count()فقط تعداد جفتهای کلید-مقدار را بازمیگرداند، ترتیب یا کلید اهمیتی ندارد. - در کار با دیتابیس یا پاسخهای JSON که ممکن است آرایه یا شیء باشند، از
is_countable()یاis_array()استفاده کنید تا رفتار پایدار داشته باشید. - برای شمارش اعضای یک شیء بدون پیادهسازی Countable میتوانید از تابعی مثل
iterator_count()استفاده کنید اگر شیء قابل پیمایش (Traversable) باشد.
خلاصهٔ سریع (جدول)
| ورودی | خروجی | نکته |
|---|---|---|
| آرایه | تعداد عناصر | پشتیبانی از COUNT_RECURSIVE |
| شیء Countable | نتیجه متد count() | کنترل کامل روی رفتار |
| null | ۰ | معمولاً بدون هشدار |
| غیرقابلشمارش | هشدار یا رفتار غیرقابلپیشبینی | از is_countable استفاده کنید |
نتیجهگیری کوتاه
تابع count() ساده اما پرقدرت است. برای استفادهٔ ایمن و بهینه آن بهتر است قبل از شمارش از is_countable() (یا حداقل is_array()) استفاده کنید، در حلقهها نتایج را کش کنید و برای اشیاء از رابط Countable بهره ببرید تا رفتار مشخص و کارآمدی داشته باشید.
آیا این مطلب برای شما مفید بود ؟




