ویژگی تصویر

تابع str_split() در PHP

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

تابع str_split() یکی از توابع ساده و پرکاربرد PHP برای تقسیم یک رشته به آرایه‌ای از زیررشته‌هاست. این تابع وقتی می‌خواهید یک رشته را به کاراکترها یا بلوک‌های با طول ثابت تقسیم کنید، بسیار مفید است.

سینتکس و پارامترها

سینتکس پایه تابع به شکل زیر است:

array str_split ( string $string [, int $split_length = 1 ] )

پارامترها:

  • $string: رشته‌ای که قرار است تقسیم شود.
  • $split_length: طول هر بلوک (به صورت عدد صحیح). مقدار پیش‌فرض همان 1 است که یعنی تقسیم به کاراکترها.

خروجی و رفتارهای معمول

خروجی یک آرایه است که هر عنصر آن زیررشته‌ای با طول برابر $split_length است؛ به جز عنصر آخر که ممکن است کوتاه‌تر باشد اگر طول رشته تقسیم‌پذیر نباشد. اگر $split_length کمتر از 1 باشد، تابع هشدار می‌دهد و مقدار FALSE بازمی‌گرداند.

مثال‌های ساده

// تقسیم یک رشته به کاراکترها
$string = "Hello";
$result = str_split($string);
// $result = ['H', 'e', 'l', 'l', 'o']

// تقسیم به بلوک‌های دو حرفی
$chunks = str_split("abcdef", 2);
// $chunks = ['ab', 'cd', 'ef']

در مثال اول، رشته به آرایه‌ای از کاراکترها تبدیل شده است. در مثال دوم، هر عنصر شامل دو کاراکتر است.

توضیح کد

در هر دو بلوک کد بالا، str_split ورودی رشته را می‌گیرد و بر اساس طول بلوک (یا پیش‌فرض 1) آن را به آرایه تقسیم می‌کند. این تابع برای عملیات ساده روی هر کاراکتر یا پردازش گروهی از کاراکترها مناسب است.

نکات مهم — کاراکترهای مولتی‌بایت (UTF-8)

نکته بسیار مهم: str_split() بر اساس بایت‌ها کار می‌کند، نه کاراکترهای یونیکد. بنابراین برای رشته‌های UTF-8 ممکن است کاراکترها در وسط بایت‌شان شکسته شوند و نتیجه‌ای نامطلوب به‌دست آید.

اگر با متون فارسی یا هر متن چندبایتی کار می‌کنید از گزینه‌های زیر استفاده کنید:

  • mb_str_split() — از PHP 7.4 به بعد موجود است و به صورت ایمن رشته‌های مولتی‌بایت را تقسیم می‌کند.
  • preg_split() با الگوی Unicode — برای نسخه‌های قدیمی‌تر می‌توانید از این راهکار استفاده کنید.

نمونه: مشکل با UTF-8

$s = "سلام";
print_r(str_split($s)); // ممکن است منجر به رشته‌های ناقص شود

این کد ممکن است خروجی ناخواسته‌ای تولید کند چون هر حرف فارسی چند بایتی است و str_split بایت‌به‌بایت تقسیم می‌کند.

روش صحیح با mb_str_split (PHP 7.4+)

$s = "سلام";
$chars = mb_str_split($s);
print_r($chars); // هر عنصر یک کاراکتر فارسی کامل خواهد بود

در این مثال، mb_str_split به درستی هر کاراکتر یونیکد را جدا می‌کند و برای پردازش متون فارسی مناسب است.

روش قدیمی‌تر با preg_split (پشتیبانی از UTF-8)

$s = "سلام";
$chars = preg_split('//u', $s, -1, PREG_SPLIT_NO_EMPTY);
print_r($chars);

این جایگزین برای نسخه‌های قبل از PHP 7.4 کار می‌کند و با استفاده از پرچم u الگوی یونیکد را فعال می‌کند تا به جای بایت، کاراکترها جدا شوند.

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

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

مقایسه سریع: str_split()، mb_str_split() و preg_split()

تابعپشتیبانی از UTF-8قابلیت تنظیم طول بلوک
str_split()خیر (بر اساس بایت)بله
mb_str_split()بلهبله
preg_split(‘//u’)بلهخیر (پیش‌فرض کاراکتر به کاراکتر)

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

از نظر کارایی، str_split برای رشته‌های کوتاه یا متوسط سریع و مناسب است. اگر روی متون طولانی با یونیکد کار می‌کنید، mb_str_split به خاطر پردازش اضافی ممکن است کمی کندتر باشد اما دقت لازم را دارد. در شرایطی که قصد دارید تعداد زیادی عملیات روی هر کاراکتر انجام دهید، بهتر است نتیجه را یک بار به آرایه تبدیل کنید و سپس روی آرایه کار کنید تا فراخوانی مکرر تابع هزینه اضافه نداشته باشد.

مثال پیشرفته: تقسیم، اصلاح و دوباره جمع کردن

$s = "0123456789";
$chunks = str_split($s, 2); // ['01','23','45','67','89']
// تبدیل هر بلوک به عدد و جمع
$sum = array_sum(array_map('intval', $chunks)); // 1 + 23 + 45 + 67 + 89 = 225
echo $sum;

در این مثال ابتدا رشته به بلوک‌های دو رقمی تقسیم شده، سپس هر بلوک به عدد تبدیل و جمع بسته شده است. این سبک پردازش برای داده‌های عددی متنی یا تحلیل فیلدهای ثابت‌طول مناسب است.

نتیجه‌گیری و پیشنهادات

تابع str_split() ابزار ساده و مفیدی برای تقسیم رشته‌ها در PHP است. برای متون ASCII یا داده‌های باینری عالی عمل می‌کند؛ اما برای متون چندبایتی (مانند فارسی) از mb_str_split() یا preg_split(‘//u’) استفاده کنید تا از شکستن کاراکترها جلوگیری شود. همیشه ورودی‌ها و نیازهای پروژه را بررسی کنید تا مناسب‌ترین تابع را انتخاب نمایید.

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

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