Menu

מיון מערך ב-PHP: sort(), usort(), asort() ו-ksort()

sort($array) ממיינת רשימה במקום, asort ו-ksort ממיינות מערך אסוציאטיבי לפי ערך או לפי מפתח, ו-usort ממיינת עם השוואה משלכם. למדו את כולן, מיינו מערך רב ממדי לפי עמודה, והימנעו מהטעות הקלאסית $sorted = sort($arr).

בדף הזה יש עורכים שאפשר להריץ - לערוך, להריץ ולראות את הפלט מיד.

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 כדי להתעלם מאותיות גדולות וקטנות.

איור של שפות התכנות ב-Coddy

ללמוד תכנות עם Coddy

להתחיל