تابع krsort() در PHP
تابع krsort() در PHP برای مرتبسازی آرایهها بر اساس کلیدها به ترتیب معکوس (نزولی) استفاده میشود. این تابع آرایه را بهصورت درجا (in-place) تغییر میدهد و ترتیب عناصر را براساس ترتیب نزولی کلیدها تنظیم میکند، در حالی که نگاشت کلید => مقدار را حفظ میکند.
تعریف و امضاء تابع
امضاء تابع به شکل زیر است:
bool krsort ( array &$array [, int $flags = SORT_REGULAR ] )
توضیح: آرایه به ارجاع گرفته میشود و نتیجه تابع بولی است (true در صورت موفقیت). پارامتر اختیاری $flags نوع مقایسه را مشخص میکند (مثل SORT_STRING، SORT_NUMERIC، SORT_NATURAL و غیره).
ویژگیهای کلیدی
- مرتب شدن بر اساس کلیدها، نه مقادیر.
- مرتبسازی به صورت نزولی (reverse order).
- کلیدها و مقادیر نگه داشته میشوند؛ krsort کلیدها را بازاندیسی نمیکند (برخلاف sort یا rsort که اندیسها را بازنویسی میکند).
- میتوان نوع مقایسه را با $flags تعیین کرد؛ مثال: SORT_STRING، SORT_NUMERIC، SORT_LOCALE_STRING، SORT_NATURAL، و ترکیب با SORT_FLAG_CASE.
- برای قواعد مرتبسازی سفارشی روی کلیدها از uksort() استفاده کنید.
مثال پایه
<?php
$arr = [
'b' => 2,
'a' => 1,
'c' => 3,
];
krsort($arr);
print_r($arr);
?>
در این مثال، کلیدها به ترتیب نزولی مرتب میشوند: c, b, a. خروجی مشابه زیر خواهد بود:
Array
(
[c] => 3
[b] => 2
[a] => 1
)
توضیح: krsort ترتیب را در جای خود تغییر میدهد؛ همچنین نگاشت کلید به مقدار حفظ میشود.
نوع مقایسه و فلگها (flags)
پارامتر $flags رفتار مقایسه را تعیین میکند. نمونههای مفید:
- SORT_REGULAR (پیشفرض): مقایسه عادی بر اساس نوعها.
- SORT_NUMERIC: مقایسه به عنوان اعداد.
- SORT_STRING: مقایسه به عنوان رشتهها بر اساس بایت.
- SORT_NATURAL: مرتبسازی طبیعی (natural order).
- SORT_FLAG_CASE: برای ترکیب با SORT_STRING یا SORT_NATURAL جهت چشمپوشی از بزرگی/کوچکی حروف.
مثال با SORT_NATURAL و SORT_FLAG_CASE
<?php
$files = [
'img10.jpg' => '...',
'img2.jpg' => '...',
'img1.jpg' => '...',
];
krsort($files, SORT_NATURAL | SORT_FLAG_CASE);
print_r(array_keys($files));
?>
توضیح: این کد کلیدها را به ترتیب طبیعی معکوس مرتب میکند، بنابراین ترتیب کلیدها به صورت img10.jpg, img2.jpg, img1.jpg خواهد بود (به دلیل NATURAL) و FLAG_CASE باعث میشود که حساسیت به حروف بزرگ/کوچک از بین برود.
تفاوت krsort با توابع مرتبسازی دیگر
| تابع | مرتبسازی براساس | حفظ کلیدها | جهت |
|---|---|---|---|
| krsort() | کلید | بله | نزولی |
| ksort() | کلید | بله | صعودی |
| arsort() | مقدار | بله | نزولی |
| asort() | مقدار | بله | صعودی |
| sort()/rsort() | مقدار | خیر (بازاندیسی) | صعودی/نزولی |
مثال پیشرفته: مرتبسازی تاریخها بر اساس کلیدهای timestamp
<?php
$events = [
1609459200 => 'New Year 2021',
1612137600 => 'Feb 2021',
1601510400 => 'Oct 2020',
];
// مرتبسازی نزولی بر اساس timestamp (کلیدها)
krsort($events, SORT_NUMERIC);
foreach ($events as $timestamp => $title) {
echo date('Y-m-d', $timestamp) . " - $titlen";
}
?>
توضیح: وقتی کلیدها timestamp عددی هستند، استفاده از SORT_NUMERIC مناسب است تا از مقایسه رشتهای جلوگیری شود. این مثال برای نمایش رویدادها از جدید به قدیمی کاربرد دارد.
نکات و نکتههای عملی (Best Practices)
- اگر نیاز به مرتبسازی بر اساس قواعد سفارشی دارید، از uksort() با تابع callback استفاده کنید (krsort تابع callback نمیپذیرد).
- krsort آرایه را درجا تغییر میدهد؛ اگر میخواهید نسخه اصلی را نگه دارید، ابتدا آرایه را کپی کنید.
- برای مجموعههای بزرگ، پیچیدگی زمانی معمولاً O(n log n) است؛ در حافظه نیز بسته به پیادهسازی ممکن است سربار اضافی وجود داشته باشد.
- برای مرتبسازی با حساسیت به تنظیمات محلی (locale) از SORT_LOCALE_STRING استفاده کنید، اما به عملکرد و سازگاری توجه کنید.
- مطمئن شوید آرگومان واقعاً آرایه باشد؛ در غیر این صورت PHP هشدار میدهد.
وقتی krsort کافی نیست — استفاده از uksort
اگر نیاز به مرتبسازی کلیدها با منطق سفارشی دارید (مثال: ترتیب بر اساس بخشی از کلید)، از uksort استفاده کنید. نمونه:
<?php
$data = [
'v1.2.0' => 'a',
'v1.10.0' => 'b',
'v1.3.0' => 'c',
];
uksort($data, function($a, $b) {
return version_compare($b, $a); // نزولی بر اساس نسخه
});
print_r($data);
?>
توضیح: در مثال بالا با استفاده از version_compare و uksort، کلیدها (نسخهها) به صورت نزولی مرتب شدهاند؛ این حالتی است که krsort با فلگهای داخلی نتواند نیازهای سفارشی را برآورده کند.
خلاصه
krsort() یک ابزار ساده و کاربردی برای مرتبسازی آرایهها بر اساس کلید به ترتیب نزولی است. با انتخاب مناسب فلگها میتوان نحوه مقایسه را کنترل کرد. در موارد نیاز به منطق پیچیدهتر، uksort جایگزین مناسب است. همیشه به این نکته توجه کنید که krsort آرایه را درجا تغییر میدهد و کلیدها را بازاندیسی نمیکند.
آیا این مطلب برای شما مفید بود ؟



