Menu

הסרת איבר ממערך ב-PHP: unset ו-array_splice

unset($array[$key]) מסירה איבר לפי מפתח, array_splice מסירה לפי מיקום וממספרת מחדש, ו-array_diff מסירה לפי ערך. למדו כל אחת מהן, איך ממספרים מחדש אחר כך, ואת המלכודת של array_search שמוחקת את האיבר הלא נכון.

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

כדי להסיר איבר ממערך 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.

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

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

להתחיל