Menu

array_filter() ב-PHP: סינון מערך לפי ערך או מפתח

array_filter($array, $callback) שומרת את האיברים שעבורם ה-callback מחזיר true. למדו איך מסירים ערכים ריקים, מסננים לפי מפתח עם ARRAY_FILTER_USE_KEY, ממספרים מחדש את התוצאה עם array_values, ומסכמים עם array_reduce.

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

array_filter($array, $callback) מחזירה את האיברים של $array שעבורם $callback מחזיר true (או כל ערך שמומר ל-true). המערך בא ראשון, ה-callback שני, והאיברים שנשארים שומרים על המפתחות המקוריים שלהם.

המפתחות בתוצאה הם 1, 3, 5, 7: המיקומים שהיו לערכים האלה במערך המקורי. הפרט הזה חשוב יותר ממה שהוא נראה, והסעיף שאחרי הבא מראה איך מתמודדים איתו.

הסרת ערכים ריקים ממערך

קראו ל-array_filter בלי callback והיא תסיר כל ערך שמומר ל-false: מחרוזות ריקות, null, false, 0, "0" ומערכים ריקים. זו הדרך המהירה ביותר לנקות את החלקים של explode() או רשימה של שדות טופס.

התוצאה הראשונה איבדה גם את "0" ואת 0, שהם לעיתים קרובות נתונים אמיתיים (כמות אפס, ספרה של מיקוד). כשאפס הוא תשובה תקינה, כתבו את ה-callback בעצמכם, כמו בקריאה השנייה. בעמוד empty יש את הרשימה המלאה של ערכים ש-PHP מחשיבה ריקים.

מספור מחדש של התוצאה עם array_values

כיוון שהמפתחות נשמרים, ברשימה מסוננת יכולים להיות פערים. לולאת for מ-0 נתקלת אז במפתחות חסרים, ו-json_encode הופכת את התוצאה לאובייקט JSON במקום למערך. array_values() ממספרת אותה מחדש.

סינון לפי מפתח עם ARRAY_FILTER_USE_KEY

הארגומנט השלישי בוחר מה ה-callback מקבל. ARRAY_FILTER_USE_KEY מעבירה רק את המפתח. ARRAY_FILTER_USE_BOTH מעבירה את הערך ואחריו את המפתח.

כדי לשמור קבוצה קבועה של מפתחות שאתם כבר מכירים, array_intersect_key($config, array_flip(['db_host', 'db_port'])) עושה את אותו הדבר בלי callback.

סינון מערך רב ממדי

רוב הנתונים האמיתיים הם רשימה של שורות. ה-callback מקבל שורה אחת בכל פעם, כך שבודקים את השדה שצריך.

שנו את $maxPrice והריצו שוב. כדי לקבל אחר כך רק את השמות, העבירו את התוצאה ל-array_column: array_column($affordable, 'name').

סינון, אחר כך מיפוי, אחר כך צמצום

array_filter בוחרת איברים, array_map משנה אותם, ו-array_reduce מקפלת את המערך לערך אחד. array_reduce($array, $callback, $initial) קוראת ל-callback עם הסכום המצטבר והאיבר הבא.

לסכום פשוט, array_sum($totals) קצרה יותר. array_reduce מצדיקה את מקומה כשהתוצאה היא משהו אחר: מחרוזת, ספירה לכל קבוצה, השורה הגדולה ביותר.

טעות נפוצה: שינוי ערכים בתוך array_filter

ערך ההחזרה של ה-callback רק מחליט אם איבר נשאר. כל דבר אחר שהוא מחשב נזרק, ולכן הקוד הזה לא עושה trim לשום דבר:

שנו עם array_map, אחר כך סננו, והוסיפו array_values כשאתם צריכים רשימה נקייה.

שאלות נפוצות

איך מסירים ערכים ריקים ממערך ב-PHP?

קראו ל-array_filter($array) בלי callback: היא משמיטה כל ערך שקרי ("", null, false, 0, "0", []). כדי להשמיט רק מחרוזות ריקות ו-null אבל לשמור על 0, העבירו callback: array_filter($array, fn($v) => $v !== '' && $v !== null).

למה array_filter שומרת את המפתחות הישנים?

array_filter אף פעם לא ממספרת מחדש: האיברים שהיא שומרת נשארים תחת המפתחות המקוריים שלהם, ולכן רשימה יכולה לחזור כ-[0 => 'a', 2 => 'c']. עטפו אותה ב-array_values() כדי לקבל שוב 0, 1, 2, וזה גם גורם ל-json_encode להפיק מערך JSON ולא אובייקט.

איך מסננים מערך לפי מפתח ב-PHP?

העבירו ARRAY_FILTER_USE_KEY כארגומנט השלישי, וה-callback יקבל את המפתח במקום הערך: array_filter($arr, fn($k) => str_starts_with($k, 'db_'), ARRAY_FILTER_USE_KEY). השתמשו ב-ARRAY_FILTER_USE_BOTH כדי לקבל את הערך ואת המפתח.

מה ההבדל בין array_filter ל-array_map?

array_filter מחליטה אילו איברים נשארים ומחזירה אותם ללא שינוי. array_map משנה כל איבר ומחזירה אותו מספר של איברים. כדי לעשות את שניהם, שרשרו אותן: array_map('strtoupper', array_filter($arr)).

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

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

להתחיל