array_unique($array) מחזירה את המערך בלי ערכים כפולים. המופע הראשון של כל ערך נשאר, תחת המפתח המקורי שלו, והעותקים המאוחרים מושמטים.
התוצאה הראשונה שומרת על המפתחות 0, 1, 3: המיקומים שבהם כל ערך הופיע לראשונה. עטפו את הקריאה ב-array_values() כשאתם רוצים רשימה נקייה, למשל לפני json_encode.
איך array_unique מחליטה ששני ערכים זהים
כברירת מחדל כל ערך מומר למחרוזת והמחרוזות מושוות. לכן 1, "1" ו-1.0 נחשבים אותו ערך, והראשון מנצח. הארגומנט השני משנה את ההשוואה.
| דגל | שני ערכים כפולים כאשר |
|---|---|
SORT_STRING (ברירת מחדל) | (string) $a === (string) $b |
SORT_REGULAR | $a == $b |
SORT_NUMERIC | הם שווים כמספרים |
עם ברירת המחדל, "01" שורד כי המחרוזת "01" אינה המחרוזת "1". עם SORT_REGULAR הוא מושמט, כי "01" == 1 מתקיים. השוואה רופפת גם מאפשרת לבוליאני true להתאים לכל ערך לא ריק. בדקו את הפלט לפני שאתם סומכים עליו עם טיפוסים מעורבים; העמוד אופרטורי השוואה מסביר את הכללים.
הסרת כפילויות בלי תלות באותיות גדולות וקטנות
array_unique רגישה לרישיות: "PHP" ו-"php" שונים. כדי להתייחס אליהם ככפולים אבל לשמור על הכתיב המקורי של הראשון, מצאו את המפתחות הייחודיים על עותק באותיות קטנות ושמרו את המפתחות האלה מהמקור.
array_map בונה עותק באותיות קטנות עם אותם מפתחות, array_unique שומרת את המפתחות של המופעים הראשונים, ו-array_intersect_key בוחרת את המפתחות האלה מתוך המערך המקורי. לטקסט עם סימנים דיאקריטיים או ביפנית, השתמשו ב-mb_strtolower במקום ב-strtolower.
array_unique על מערך רב ממדי
בלי דגל, array_unique ממירה כל שורה למחרוזת "Array", כך שכל השורות נראות זהות ורק הראשונה שורדת, עם אזהרת "Array to string conversion" לכל שורה. העבירו SORT_REGULAR כדי להשוות שורות שלמות. כדי לשמור שורה אחת לכל ערך של שדה בודד, array_column עם null ומפתח אינדקס פשוטה יותר.
הגישה השנייה שומרת את השורה האחרונה לכל אימייל, כי כל שורה מאוחרת דורסת את המוקדמת תחת אותו מפתח. העמוד array_column מסביר את מפתח האינדקס בפירוט.
מציאה וספירה של ערכים כפולים
array_count_values() מחזירה כמה פעמים מופיע כל ערך. סננו אותה לספירות שגדולות מאחת וקיבלתם את הכפילויות.
הבדיקה האחרונה היא שורה נפוצה לבדוק אם יש במערך כפילויות בכלל.
ערכים ייחודיים מהר יותר במערכים גדולים
array_unique ממירה כל ערך למחרוזת לפני ההשוואה, וזה בסדר לאלפי ערכים. ברשימה גדולה של מספרים שלמים או מחרוזות, היפוך המערך מהיר יותר: ערכים הופכים למפתחות, ומפתחות הם ייחודיים מעצם הגדרתם.
הזמנים משתנים מהרצה להרצה, אבל גרסת ההיפוך מהירה בדרך כלל פי כמה. היא עובדת רק לערכים שיכולים להיות מפתחות מערך (מספרים שלמים ומחרוזות), ומחרוזות מספריות כמו "5" חוזרות כמספרים שלמים.
שאלות נפוצות
האם array_unique שומרת על המפתחות?
כן. היא שומרת את המופע הראשון של כל ערך תחת המפתח המקורי שלו ומשמיטה את המאוחרים, ולכן במפתחות יכולים להיות פערים. השתמשו ב-array_values(array_unique($arr)) כדי למספר אותם מחדש מ-0.
איך משתמשים ב-array_unique על מערך רב ממדי?
העבירו SORT_REGULAR כדי שיושוו שורות שלמות: array_unique($rows, SORT_REGULAR). כדי לשמור שורה אחת לכל ערך של שדה, כמו שורה אחת לכל אימייל, תנו לשורות מפתחות לפי השדה הזה: array_column($rows, null, 'email') שומרת את השורה האחרונה לכל אימייל.
איך מסירים כפילויות בלי תלות באותיות גדולות וקטנות?
מצאו את המפתחות הייחודיים על עותק באותיות קטנות ושמרו את המפתחות האלה מהמקור: array_intersect_key($arr, array_unique(array_map('strtolower', $arr))). השתמשו ב-mb_strtolower לטקסט מחוץ ל-ASCII.
איך מוצאים אילו ערכים כפולים במערך PHP?
ספרו אותם עם array_count_values($arr), ואז שמרו את הספירות שגדולות מאחת: array_keys(array_filter(array_count_values($arr), fn($n) => $n > 1)). array_count_values עובדת רק על מחרוזות ומספרים שלמים.