כדי להסיר איבר ממערך PHP לפי המפתח שלו, השתמשו ב-unset($array[$key]). האיבר נעלם, שאר המפתחות נשארים בדיוק כמו שהיו, ו-unset למפתח שלא קיים אינה שגיאה.
הסתכלו על התוצאה השנייה: המפתחות עכשיו הם 0, 2, 3. unset אף פעם לא ממספרת מחדש.
מספור המערך מחדש אחרי unset
רשימה עם פער במפתחות שלה גורמת לצרות בהמשך: לולאת for ($i = 0; ...) נתקלת באינדקס החסר, ו-json_encode כותבת אובייקט JSON במקום מערך. array_values() נותנת לכם שוב מפתחות נקיים.
הסרה לפי מיקום עם array_splice
array_splice($array, $offset, $length) מסירה $length איברים החל ממיקום $offset, ממספרת מחדש את המפתחות ומחזירה את מה שהסירה. היסט שלילי נספר מהסוף. היא יכולה גם להכניס איברים חלופיים באותה קריאה.
array_splice עובדת על מיקומים, לא על מפתחות: במערך אסוציאטיבי היא מסירה לפי המקום בסדר, והיא שומרת על מפתחות מחרוזת. העמוד array_slice משווה אותה ל-array_slice, שמעתיקה חלק בלי לשנות את המקור.
הסרת איבר לפי ערך
array_diff($array, [$value]) מחזירה את המערך בלי כל איבר ששווה ל-$value, ושומרת על המפתחות של השאר. כדי להסיר רק את ההתאמה הראשונה, מצאו את המפתח שלה עם array_search ועשו לה unset.
array_diff משווה ערכים כמחרוזות, ולכן array_diff([1, "1", 2], [1]) מסירה גם את המספר השלם וגם את המחרוזת. כשהתנאי הוא יותר מ"שווה לערך הזה", השתמשו ב-array_filter עם callback.
הסרת האיבר הראשון או האחרון
array_shift() מסירה את האיבר הראשון ו-array_pop() מסירה את האחרון. שתיהן מחזירות את האיבר שהסירו, וזה הופך אותן לשימושיות לתורים ולמחסניות.
array_shift ממספרת מחדש מפתחות מספריים מ-0. array_pop לא צריכה, כי הפער נמצא בסוף.
הסרת כמה מפתחות בבת אחת
unset מקבלת כמה איברים בקריאה אחת. כדי להסיר רשימת מפתחות שנמצאת אצלכם במערך, הפכו אותה עם array_flip() כך שהשמות יהפכו למפתחות, ואז העבירו אותה ל-array_diff_key().
טעות נפוצה: unset עם array_search כשהערך חסר
array_search מחזירה false כשהיא לא מוצאת כלום, ו-false שמשמש כמפתח מערך הופך ל-0. לכן השורה הזו מוחקת את האיבר הראשון בכל פעם שהערך לא נמצא במערך:
תמיד שמרו את התוצאה של array_search והשוו אותה עם !== false לפני שאתם משתמשים בה כמפתח. גם if ($key) פשוט לא מספיק: התאמה באינדקס 0 היא שקרית גם כן.
שאלות נפוצות
איך מסירים איבר ממערך לפי ערך ב-PHP?
כדי להסיר כל מופע, השתמשו ב-array_diff($arr, ['value']). כדי להסיר רק את הראשון, מצאו את המפתח שלו ועשו לו unset, ובדקו שהוא נמצא: $k = array_search('value', $arr); if ($k !== false) { unset($arr[$k]); }.
איך ממספרים מערך מחדש אחרי unset?
עטפו אותו ב-array_values(): $arr = array_values($arr); ממספרת את המפתחות מחדש מ-0. לחלופין, הסירו את האיבר עם array_splice($arr, $index, 1), שממספרת מחדש בשבילכם.
איך מסירים את האיבר הראשון או האחרון של מערך?
array_shift($arr) מסירה ומחזירה את האיבר הראשון וממספרת מחדש את המפתחות המספריים. array_pop($arr) מסירה ומחזירה את האיבר האחרון.
אפשר לעשות unset לאיבר בתוך לולאת foreach?
כן. foreach ($arr as $k => $v) { if ($v < 0) { unset($arr[$k]); } } בטוח, כי foreach עוברת על עותק של המערך בזמן שאתם משנים את המקור. במפתחות נשארים פערים, אז קראו ל-array_values() אחר כך אם אתם צריכים רשימה.
האם unset על מפתח חסר גורם לשגיאה?
לא. unset($arr['missing']) לא עושה כלום ולא מעלה אזהרה, ולכן אין צורך לבדוק קודם עם isset.