ویژگی تصویر

متد count() در PHP

  /  PHP   /  متد count() در PHP
بنر تبلیغاتی الف
آموزش 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 بهره ببرید تا رفتار مشخص و کارآمدی داشته باشید.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: