ویژگی تصویر

تابع natcasesort() در PHP

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

در توسعهٔ وب معمولاً نیاز داریم رشته‌هایی را بر اساس محتوای عددی و حروفی به صورت «طبیعی» مرتب کنیم؛ مثلاً “file2” باید قبل از “file10” قرار بگیرد. تابع natcasesort() در PHP دقیقاً برای این نوع مرتب‌سازی طراحی شده است: مرتب‌سازی طبیعی (natural order) با عدم حساسیت به بزرگی یا کوچکی حروف و حفظ ارتباط کلیدها با مقادیر (index association).

ویژگی‌های کلیدی natcasesort()

  • مرتب‌سازی بر مبنای الگوریتم natural sort (اعداد درون رشته‌ها به صورت عددی مقایسه می‌شوند).
  • حساسیت به حروف غایب است — یعنی case-insensitive.
  • کلیدهای آرایه نگه داشته می‌شوند (رشته‌ها یا اعداد شاخص‌ها تغییر نمی‌کنند).
  • تابع مقدار بولی (true/false) برمی‌گرداند که نشان‌دهنده موفقیت در مرتب‌سازی است.

نحو و مقدار بازگشتی

نحو ساده است:

bool natcasesort ( array &$array )

با پاس‌دادن آرایه به شکل مرجع (&$array) خود آرایه مرتب می‌شود و تابع true یا false برمی‌گرداند.

مثال پایه

<?php
$files = [
    3 => "Image10.png",
    1 => "image2.png",
    2 => "image1.png",
    4 => "Image20.png"
];

natcasesort($files);
print_r($files);
?>

در مثال بالا، natcasesort() ترتیب طبیعی و بدون حساسیت به حروف را اعمال می‌کند؛ خروجی ترتیب فایل‌ها براساس عدد داخل نام پرونده خواهد بود: image1.png, image2.png, Image10.png, Image20.png — و کلیدهای اصلی (3,1,2,4) حفظ می‌شوند اما مرتب‌سازی روی مقادیر انجام شده است.

توضیح دقیق‌تر مثال

با natcasesort()، مقایسه‌ها به صورت «strnatcasecmp» انجام می‌شوند؛ یعنی اعداد داخل رشته‌ها به عنوان اعداد مقایسه می‌شوند و حروف بزرگ یا کوچک تفاوتی ندارند. بنابراین “image2.png” قبل از “Image10.png” قرار می‌گیرد حتی اگر در ترتیب ASCII “1” قبل از “2” بیاید یا با وضعیت حروف تفاوتی داشته باشیم.

تفاوت natcasesort با natsort و sort

تابعطبیعی؟حساس به حروف؟حفظ کلیدها؟
natcasesort()بلهخیر (case-insensitive)بله
natsort()بلهبله (case-sensitive)بله
sort()خیربله/قابل تغییر با فلگخیر (شاخص‌ها ری‌ایندکس می‌شوند)

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

<?php
$arr = ["a2", "A10", "a1", "A11"];

// natsort (case-sensitive)
$n = $arr;
natsort($n);

// natcasesort (case-insensitive)
$nc = $arr;
natcasesort($nc);

// regular sort
$s = $arr;
sort($s);

var_dump($n);
var_dump($nc);
var_dump($s);
?>

در این مثال خواهید دید که natsort ترتیب را با در نظر گرفتن حروف بزرگ و کوچک اعمال می‌کند، natcasesort آنها را بدون توجه به case مرتب می‌کند و sort رفتار lexicographic ساده را انجام می‌دهد و کلیدها را بازایندکس می‌کند.

موارد کاربرد واقعی و نکات عملی

  • مرتب‌سازی اسم فایل‌ها یا لیست فایل‌هایی که شامل اعداد هستند (image1, image2, image10).
  • نمایش لیست محصولات دارای شناسه‌های ترکیبی (item2, item10) به صورت طبیعی برای کاربر.
  • وقتی می‌خواهیم ترتیب ظاهری منطقی و انسانی برای نمایش داده‌ها داشته باشیم و حساسیت به بزرگ/کوچک بودن حروف نامطلوب است.

محدودیت‌ها و نکات بین‌المللی/UTF-8

natcasesort() بر پایهٔ مقایسه‌های بایت-محور عمل می‌کند و برای رشته‌های غیر ASCII یا یونیکد ممکن است رفتار دلخواه فنی را ندهد (مثلاً حروف فارسی یا کاراکترهای ترکیبی). بنابراین اگر نیاز به مرتب‌سازی حساس به قواعد زبانی یا ملیتی دارید، بهتر است از روش‌هایی مانند کلاس IntlCollator (درصورت نصب بودن اکستنشن Intl) یا پیاده‌سازی مقایسهٔ سفارشی استفاده کنید.

مثال: مرتب‌سازی کلیدها به روش طبیعی (بر اساس کلیدها)

<?php
$assoc = [
    "file20" => "x",
    "file3"  => "y",
    "file1"  => "z"
];

// اگر بخواهیم بر اساس کلیدها به صورت natural و case-insensitive مرتب کنیم:
uksort($assoc, 'strnatcasecmp');
print_r($assoc);
?>

توضیح: natcasesort روی مقادیر آرایه عمل می‌کند؛ اگر بخواهیم بر اساس کلیدها مرتب کنیم، از uksort با تابع strnatcasecmp (مقایسهٔ طبیعی و بدون حساسیت به حروف) استفاده می‌کنیم. در خروجی کلیدها به ترتیب natural قرار می‌گیرند و مقادیر متناظر حفظ می‌شوند.

نکات حرفه‌ای و بهینه‌سازی

  • برای مجموعه‌های بسیار بزرگ، پیچیدگی زمانی مرتب‌سازی معمولاً O(n log n) است؛ هزینهٔ اجرای تابع مقایسه را در نظر بگیرید. اگر مقایسه پیچیده‌ای دارید، سعی کنید داده‌ها را پیش‌پردازش کنید (مثلاً استخراج بخش عددی) تا مقایسه سریع‌تر شود.
  • برای پشتیبانی بهتر از یونیکد، از IntlCollator یا پیاده‌سازی سفارشی استفاده کنید. در برخی موارد، تبدیل رشته‌ها به شکل نرمال یا حذف دیاکریتیک‌ها کمک‌کننده است.
  • اگر دنبال مرتب‌سازی بدون تغییر کلیدها هستید natcasesort گزینهٔ مناسب است؛ اما اگر می‌خواهید آرایهٔ نتیجه را بازایندکس‌شده دریافت کنید، می‌توانید پس از natcasesort از array_values() استفاده کنید.

مثال کاربردی: تهیه لیست مرتب فایل‌ها برای نمایش در UI

<?php
$files = ["img12.jpg", "img10.jpg", "img2.jpg", "Img1.jpg"];

// sort naturally, case-insensitive and keep keys
natcasesort($files);

// reset numeric keys if needed (reindex)
$files = array_values($files);

foreach ($files as $f) {
    echo "<li>" . htmlspecialchars($f) . "</li>";
}
?>

این قطعه فهرست فایل‌ها را به ترتیب طبیعی و بدون حساسیت به حروف مرتب می‌کند و سپس کلیدها را با array_values بازایندکس می‌کند تا برای نمایش در HTML آماده شود. تابع htmlspecialchars برای ایمن‌سازی خروجی در برابر XSS استفاده شده است.

خلاصه

تابع natcasesort() در PHP ابزار ساده و کارآمدی برای مرتب‌سازی طبیعی و بدون حساسیت به حروف است، زمانی که می‌خواهید مقادیر آرایه را به شکل «انسانی» مرتب کنید و کلیدهای آرایه حفظ شوند. برای داده‌های غیر ASCII یا نیازهای زبانی پیچیده‌تر، از راه‌حل‌های بین‌المللی‌تر یا مرتب‌سازی سفارشی استفاده کنید.

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

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