ترتّب sort($array) مصفوفة ترتيبًا تصاعديًا، في مكانها. تغيّر المتغير الذي تمرره وتعيد true، لذا تستدعيها في سطر مستقل ثم تستخدم المصفوفة. وترتّب rsort() ترتيبًا تنازليًا.
لدى PHP دالة ترتيب لكل تركيبة من «حسب القيمة أو حسب المفتاح» و«تصاعدي أو تنازلي» و«الاحتفاظ بالمفاتيح أو لا»:
| الدالة | ترتّب حسب | الاتجاه | المفاتيح |
|---|---|---|---|
sort | القيمة | تصاعدي | يُعاد ترقيمها 0, 1, 2 |
rsort | القيمة | تنازلي | يُعاد ترقيمها |
asort | القيمة | تصاعدي | تُحفظ |
arsort | القيمة | تنازلي | تُحفظ |
ksort | المفتاح | تصاعدي | تُحفظ |
krsort | المفتاح | تنازلي | تُحفظ |
usort | دالتك | حسب اختيارك | يُعاد ترقيمها |
uasort | دالتك | حسب اختيارك | تُحفظ |
uksort | دالتك على المفاتيح | حسب اختيارك | تُحفظ |
ترتيب مصفوفة ترابطية حسب القيمة
ترمي sort() على مصفوفة ترابطية المفاتيح. استخدم asort() للترتيب حسب القيمة مع إبقاء كل مفتاح مع قيمته، أو arsort() للأعلى أولًا.
ترتيب مصفوفة حسب المفتاح بـ ksort
ترتّب ksort() حسب المفتاح، وkrsort() حسب المفتاح عكسيًا. وهذا مفيد قبل طباعة الإعدادات أو بناء نص استعلام بترتيب ثابت.
ترتيب مخصص بـ usort وعامل المركبة الفضائية
تتيح لك usort($array, $callback) أن تقرر الترتيب. تتلقى دالة الاستدعاء عنصرين وتعيد عددًا سالبًا إذا كان يجب أن يأتي الأول أولًا، وعددًا موجبًا إذا كان يجب أن يأتي الثاني، و0 إذا كانا متساويين. ويعيد عامل المركبة الفضائية <=> هذا بالضبط.
لـ banana وcherry الطول نفسه، لذا تعيد دالة الاستدعاء 0 لهما ويبقيان بالترتيب الذي كانا عليه. الترتيب في PHP مستقر منذ PHP 8.0: العناصر المتساوية تحتفظ بترتيبها السابق.
ترتيب مصفوفة متعددة الأبعاد حسب قيمة
لترتيب قائمة من الصفوف حسب حقل واحد، قارن ذلك الحقل في usort. وللترتيب حسب حقلين، قارن مصفوفات: يقارنها <=> عنصرًا عنصرًا، فلا يحسم الحقل الثاني إلا التعادل في الأول.
تضع المقارنة الثانية $b["age"] في الطرف الأول و$a["age"] في الطرف الثاني، وهذا يعكس ترتيب العمر وحده. وتعطي array_multisort(array_column($people, 'city'), SORT_ASC, array_column($people, 'age'), SORT_DESC, $people) الترتيب نفسه دون دالة استدعاء: ترتّب حسب الأعمدة المستخرجة وتعيد ترتيب $people لتطابقها.
الترتيب الطبيعي وأعلام الترتيب
افتراضيًا تقارن PHP الأعداد أعدادًا والنصوص نصوصًا. وأسماء الملفات التي فيها أرقام تُرتَّب بطريقة لا يتوقعها الناس: يأتي img10 قبل img2، ويأتي كل اسم بأحرف كبيرة قبل كل اسم بأحرف صغيرة. تغيّر الأعلام طريقة مقارنة القيم.
يقرأ SORT_NATURAL سلاسل الأرقام أعدادًا، ويتجاهل SORT_FLAG_CASE الأحرف الكبيرة والصغيرة، ويفرض SORT_STRING مقارنة محرفًا محرفًا حتى للنصوص الرقمية. وnatsort() وnatcasesort() الفكرة نفسها لكنهما تحتفظان بالمفاتيح.
خطأ شائع: إسناد نتيجة sort
كل دالة ترتيب تعيد true وتغيّر المصفوفة التي تمررها. وإسناد القيمة المعادة يضيّع المصفوفة:
إذا احتجت إلى نسخة مرتبة وأردت الاحتفاظ بالأصل، فانسخ المصفوفة إلى متغير جديد أولًا ورتّب النسخة، كما يفعل مثال asort أعلاه مع $copy.
الأسئلة الشائعة
لماذا تعيد sort() القيمة true بدل المصفوفة المرتبة؟
ترتّب دوال الترتيب في PHP المصفوفة في مكانها، عبر مرجع، وتعيد true. استدعِ sort($arr); في سطر مستقل واستخدم $arr بعده. كتابة $arr = sort($arr); تستبدل مصفوفتك بـ true.
كيف أرتّب مصفوفة ترابطية حسب القيمة وأحتفظ بالمفاتيح؟
استخدم asort($arr) للترتيب التصاعدي أو arsort($arr) للتنازلي. ترتّب sort() وrsort() أيضًا حسب القيمة لكنهما ترميان المفاتيح وتعيدان الترقيم من 0.
كيف أرتّب مصفوفة متعددة الأبعاد حسب قيمة في PHP؟
استخدم usort مع عامل المركبة الفضائية على الحقل: usort($rows, fn($a, $b) => $a['age'] <=> $b['age']);. بدّل بين $a و$b للترتيب التنازلي، وقارن مصفوفات مثل [$a['city'], $a['age']] <=> [$b['city'], $b['age']] للترتيب حسب حقلين.
هل الترتيب في PHP مستقر؟
نعم، منذ PHP 8.0 كل دوال الترتيب مستقرة: العناصر المتساوية في المقارنة تحتفظ بالترتيب الذي كانت عليه قبل الترتيب. وهذا ما يجعل الترتيب حسب حقل ثم حسب آخر يعمل كما هو متوقع.
كيف أرتّب نصوصًا فيها أرقام ترتيبًا طبيعيًا؟
استخدم natsort($arr) أو sort($arr, SORT_NATURAL)، اللتين تضعان img2 قبل img10. أضف SORT_FLAG_CASE (SORT_NATURAL | SORT_FLAG_CASE) أو استخدم natcasesort لتجاهل الأحرف الكبيرة والصغيرة.