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) מאפשרת לכם להחליט על הסדר. ה-callback מקבל שני איברים ומחזיר מספר שלילי אם הראשון צריך לבוא קודם, מספר חיובי אם השני צריך, ו-0 אם הם שווים. אופרטור החללית <=> מחזיר בדיוק את זה.
ל-banana ול-cherry יש אותו אורך, ולכן ה-callback מחזיר עבורם 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) נותנת את אותו סדר בלי callback: היא ממיינת לפי העמודות שחולצו ומסדרת מחדש את $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 כדי להתעלם מאותיות גדולות וקטנות.