Menu
Coddy logo textTech

מיון בסדר טבעי

חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-PHP של Coddy. שיעור 24 מתוך 68.

אף שפונקציות המיון הסטנדרטיות של PHP פועלות היטב ברוב המקרים, הן עלולות להפיק תוצאות בלתי צפויות בעת מיון מחרוזות שמכילות מספרים. הפונקציה natsort() פותרת את הבעיה באמצעות אלגוריתם של ״סדר טבעי״, שממיין מחרוזות באופן שבני אדם מצפים לו באופן טבעי.

עיינו בדוגמה הזאת עם שמות קבצים:

<?php
$files = ["file1.txt", "file10.txt", "file2.txt", "file20.txt"];

// מיון רגיל באמצעות sort() מפיק: file1.txt, file10.txt, file2.txt, file20.txt
sort($files);
print_r($files);

// אפס את המערך
$files = ["file1.txt", "file10.txt", "file2.txt", "file20.txt"];

// natsort() מפיק: file1.txt, file2.txt, file10.txt, file20.txt
natsort($files);
print_r($files);
?>

ההבדל מכריע: sort() רגילה משווה מחרוזות תו אחר תו, ולכן "file10.txt" מופיע לפני "file2.txt" כי "1" מופיע לפני "2" ב-ASCII. עם זאת, natsort() מזהה את החלקים המספריים וממיינת אותם מספרית, כך ש-"file2.txt" מופיע לפני "file10.txt", כפי שהיית מצפה באופן טבעי.

בדומה לפונקציות מיון אחרות ב-PHP, natsort() משנה ישירות את המערך המקורי. לכן היא שימושית במיוחד לארגון רשימות קבצים, מספרי גרסאות או כל נתון שבו מחרוזות מכילות מספרים שיש למיין לפי ערכם המספרי ולא לפי סדר האלפבית.

challenge icon

אתגר

קל

תקבלו קלט אחד: מערך של מספרי גרסאות תוכנה בפורמט JSON. קראו את הקלט, המירו את מחרוזת ה-JSON למערך, השתמשו ב-natsort() כדי למיין את מספרי הגרסאות בסדר טבעי, והדפיסו את המערך הממוין באמצעות print_r().

פורמט הקלט: שורה אחת המכילה מערך JSON של מחרוזות גרסאות (לדוגמה: ["v1.10","v1.2","v1.20","v1.3"])

הפלט הצפוי: המערך הממוין בסדר טבעי, המוצג באמצעות print_r()

נסו בעצמכם

<?php
// קרא את הקלט
$input = fgets(STDIN);

// המר מחרוזת JSON למערך
$versions = (array)json_decode($input, true);

// TODO: כתוב את הקוד שלך למטה כדי למיין את המערך באמצעות natsort()


// הצג את המערך הממוין
print_r($versions);
?>
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה לוגיקה וזרימת תוכנית

תרגלו בעצמכם: קומפיילר PHP אונליין