ویژگی تصویر

تابع count_chars() در PHP

  /  PHP   /  تابع count_chars() در PHP
بنر تبلیغاتی الف
آموزش PHP

تابع count_chars() یکی از توابع مفید و سریع در PHP برای بررسی فراوانی بایت‌ها (کاراکترها) داخل یک رشته است. این تابع به شما اجازه می‌دهد تعداد وقوع هر بایت (از 0 تا 255) را بدست آورید یا فهرستی از کاراکترهای موجود یا غایب را تولید کنید. در ادامه با کاربردها، حالت‌ها، مثال‌های عملی و نکات مهم از جمله محدودیت‌های رشته‌های چندبایتی آشنا می‌شویم.

نحو و پارامترها

تابع به شکل زیر استفاده می‌شود:

mixed count_chars ( string $string [, int $mode = 0 ] )

پارامترها:

  • $string: رشته‌ای که می‌خواهید فراوانی کاراکترها را در آن بشمرید.
  • $mode: عدد بین 0 تا 4 که حالت خروجی را مشخص می‌کند.

توضیح حالت‌ها (mode)

modeخروجیتوضیح
0آرایهآرایه‌ای با کلیدهای 0..255 و مقدار برابر تعداد تکرار هر بایت (پیش‌فرض)
1آرایهمشابه mode=0 اما فقط بایت‌هایی که تعدادشان بزرگ‌تر از 0 هستند
2آرایهمشابه mode=0 اما فقط بایت‌هایی که وجود ندارند (تعداد برابر 0)
3رشتهرشته‌ای از همه کاراکترهای موجود (هر کاراکتر یکبار، بر اساس مقدار بایت صعودی)
4رشتهرشته‌ای از همه کاراکترهای غایب

مثال‌های عملی

<?php
$str = "Hello, PHP! 123";
print_r(count_chars($str, 1));
?>

در این مثال خروجی یک آرایه است که کلیدهای آن اعداد ASCIIِ کاراکترهای موجود در $str را نشان می‌دهد و مقدار هر کلید تعداد وقوع همان کاراکتر است. برای خواناتر کردن خروجی می‌توانیم از chr() استفاده کنیم تا کلیدها را به کاراکتر تبدیل کنیم.

<?php
$str = "Hello, PHP! 123";
$counts = count_chars($str, 1);
foreach ($counts as $ascii => $count) {
    echo chr($ascii) . " : " . $count . PHP_EOL;
}
?>

در این کد ابتدا آرایه فراوانی را دریافت کرده و سپس هر کد ASCII را با chr() به کاراکتر تبدیل کرده و تعداد آن را چاپ می‌کنیم. این روش برای تولید خروجی خوانا و انسانی مفید است.

کاربردهای واقعی و مثال‌های مفید

  • شناسایی پرکاربردترین کاراکترها در یک متن (مثلاً برای تحلیل متن یا بهینه‌سازی فشرده‌سازی).
  • کشف اینکه کدام کاراکترها در یک سند استفاده نشده‌اند (mode=4) برای تولید جدول کاراکتر قابل استفاده.
  • بررسی وجود کاراکترهای کنترلی یا فاصله‌های نامرئی که ممکن است پردازش را دچار خطا کنند.

پیدا کردن پرکاربردترین کاراکتر

<?php
$str = "banana";
$counts = count_chars($str, 1);
asort($counts); // صعودی بر اساس مقدار
$most = end($counts); // بزرگترین مقدار
$char = chr(key($counts)); // کاراکتر متناظر
echo "Most frequent: " . $char . " = " . $most . PHP_EOL;
?>

کد بالا فراوانی کاراکترها را محاسبه کرده، مرتب می‌کند و پس از آن کاراکتر با بیشترین تکرار را از آرایه استخراج می‌کند. توجه کنید که برای دریافت کلید کنونی از key() استفاده شده است.

محدودیت‌ها: رشته‌های چندبایتی (UTF-8)

نکته مهم: count_chars بر بایت‌ها عمل می‌کند، نه بر کاراکترهای یونیکد. بنابراین برای رشته‌های UTF-8 که کاراکترها ممکن است چندبایتی باشند، خروجی ممکن است غیرمنتظره باشد. برای متون فارسی یا هر متن UTF-8 باید از روش‌های مخصوص چندبایتی استفاده کنید.

<?php
$str = "سلام دنیا"; // UTF-8
// روش ناسازگار با چندبایت:
print_r(count_chars($str, 1));

// روش سازگار با چندبایت:
$chars = preg_split('//u', $str, -1, PREG_SPLIT_NO_EMPTY);
$counts = array_count_values($chars);
print_r($counts);
?>

در این مثال، ابتدا نشان داده‌ایم که count_chars روی رشته UTF-8 نتیجهٔ معناداری برای کاراکترهای فارسی نمی‌دهد چون آن‌ها را به بایت‌های جداگانه تقسیم می‌کند. سپس با استفاده از preg_split('//u', ...) رشته را بر اساس یونیکد جدا کرده و با array_count_values() فراوانی هر کاراکتر واقعی را محاسبه می‌کنیم. این روش برای پردازش متون فارسی توصیه می‌شود.

بهینه‌سازی و نکات عملکردی

  • برای رشته‌های خیلی بزرگ، count_chars بسیار سریع و بهینه است چون روی بایت‌ها عمل می‌کند. اما اگر نیاز به UTF-8 دارید، تبدیل به آرایه کاراکترها با preg_split('//u', ...) حافظه بیشتری مصرف می‌کند.
  • اگر فقط می‌خواهید بدانید آیا یک کاراکتر خاص وجود دارد، بهتر است از strpos() یا mb_strpos() استفاده کنید تا لازم نباشد کل رشته را پردازش کنید.
  • برای آنالیزهای آماری پیشرفته می‌توانید خروجی count_chars را به فرمت JSON یا CSV تبدیل کرده و در ابزارهای دیگر پردازش کنید.

نمونه: نمایش کاراکترهای پرینت‌پذیر و تعداد آن‌ها

<?php
$str = "HellonWorld! 123";
$counts = count_chars($str, 1);
foreach ($counts as $ascii => $count) {
    if ($ascii >= 32 && $ascii  ' . $count . PHP_EOL;
    }
}
?>

این کد تنها کاراکترهای قابل چاپ در بازه ASCII را نمایش می‌دهد و کاراکترهای کنترلی مانند خط جدید را فیلتر می‌کند. این روش برای پاکسازی ورودی‌ها یا نمایش خواناتر مفید است.

خلاصه و جمع‌بندی

تابع count_chars() در PHP ابزار ساده و پرسرعتی برای شمارش بایت‌ها و تحلیل کاراکترها است. برای متن‌های ASCII و پردازش‌های باینری بسیار مناسب است ولی برای متون UTF-8 (مثل فارسی) باید از روش‌های چندبایتی استفاده کنید. با ترکیب count_chars با توابعی مثل chr(), array_count_values(), و preg_split(..., PREG_SPLIT_NO_EMPTY) می‌توانید آنالیزهای قدرتمندی روی رشته‌ها انجام دهید.

در هنگام کار با متون فارسی یا یونیکد، همیشه بررسی کنید که عملیات شما بر بایت‌ها انجام نمی‌شود مگر آنکه قصد کار روی بایت‌ها را داشته باشید؛ در غیر این صورت از توابع mb_ یا روش‌های تقسیم یونیکد استفاده کنید.

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

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