Menu

empty() ב-PHP: בדיקת מחרוזות ריקות, מערכים ו-0

empty($var) מחזירה true כשמשתנה חסר או שקרי: null, false, 0, 0.0, "", "0" או []. היא אף פעם לא מזהירה על משתנים או מפתחות לא מוגדרים. למדו למה "0" נחשב ריק, איך לבדוק בדיוק מחרוזת או מערך ריקים, empty מול isset ואימות קלט מטפסים.

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

empty($var) מחזירה true אם המשתנה לא קיים או שהערך שלו שקרי: null, false, 0, 0.0, "", "0" או מערך ריק []. לכל ערך אחר היא מחזירה false. כמו isset(), היא אף פעם לא מזהירה על משתנים או מפתחות מערך לא מוגדרים.

empty($x) זהה ל-!isset($x) || !$x. במילים אחרות: חסר, או מומר ל-false.

אילו ערכים ריקים

בחרו ערך בטבלה כדי לראות את empty() ליד isset() וליד ההמרה (bool). כל תא חושב על ידי PHP 8.3.

empty, isset ו-(bool) לכל ערך של $x
Point at or tap a cell to read it as PHP.
$xemptyissetbool
null
false
0
0.0
""
"0"
[]
" "
"0.0"
"a"
"null"
[0]
1
-1
Every cell computed by PHP 8.3.19.

ההפתעות נמצאות בשני הקצוות: "0" ריק, בעוד " " (רווח), "0.0", "null" ו-[0] לא.

"0" ריק: הבאג הקלאסי

כיוון ש-"0" שקרי, empty() מתייחסת לכמות 0, לציון 0 או לקוד PIN "0" כאל "לא הוזן כלום". זה פוגע בטפסים, שבהם כל ערך מגיע כמחרוזת.

לקלט טקסט, הבדיקה האמינה ל"לא הוזן כלום" היא trim($value) === "". השאירו את empty() לערכים שבהם 0 באמת אומר כלום.

בדיקה אם מחרוזת ריקה

כדי לבדוק בדיוק מחרוזת ריקה, השוו ל-"". כדי להתייחס גם לרווחים כריקים, הפעילו קודם trim. מאז PHP 5.5 empty() מקבלת ביטויים, אז גם empty(trim($s)) עובד (אבל עם אותה בעיה של "0").

trim() לא מקבלת null בלי הודעת deprecation ב-PHP 8.1 ואילך, ולכן הבלוק כותב trim($s ?? "").

בדיקה אם מערך ריק

במערכים, empty($arr), $arr === [] ו-count($arr) === 0 נותנים כולם אותה תשובה. ל-empty() יש יתרון: היא עובדת על משתנה או מפתח שאולי לא קיימים.

array_filter() בלי callback מסירה כל ערך שקרי, ולכן זו דרך מהירה לשאול "האם המערך הזה מכיל משהו אמיתי".

אימות שדה חובה בטופס

!empty() היא דרך נפוצה לחייב שדה, כל עוד 0 אינו תשובה תקינה. הריצו את הבלוק, השאירו את השדות ריקים ולחצו על Send, ואז מלאו אותם ושלחו שוב: הסקריפט ירוץ פעם נוספת כש-$_POST מלא.

empty($_POST["terms"]) מכסה את שני המקרים של תיבת הסימון: לא נשלחה בכלל, או נשלחה עם ערך ריק. עמוד הטפסים מתקדם יותר עם הודעות שגיאה לכל שדה.

empty מול isset

שתיהן בטוחות על משתנים ומפתחות לא מוגדרים. הן עונות על שאלות שונות:

  • isset($x): האם זה קיים ואינו null? השתמשו בה למפתחות אופציונליים, לתיבות סימון ול"האם זה נשלח בכלל".
  • !empty($x): האם זה קיים ואמיתי? השתמשו בה ל"יש משהו אמיתי", כש-0 ו-"0" לא נחשבים.
  • $x === "" או $x === []: האם זה ריק בדיוק? השתמשו בזה כש-0 הוא ערך תקין.

עמוד isset מכסה את החצי השני, כולל isset() עם כמה משתנים בבת אחת וההבדל מ-array_key_exists().

שאלות נפוצות

אילו ערכים empty() מחשיבה כריקים ב-PHP?

empty($x) היא true כש-$x לא קיים או שהוא null, false, 0, 0.0, "", "0" או []. כל השאר לא ריק, כולל " " (רווח), "0.0", "false" ו-[0].

למה "0" נחשב ריק ב-PHP?

empty() זהה ל-!$x בלי האזהרה על משתנים לא מוגדרים, והמחרוזת "0" מומרת ל-false. זה הופך את empty() לשגויה בשדות שבהם 0 הוא תשובה תקינה; בדקו במקום זאת $x === '' או trim($x) === ''.

איך בודקים אם מערך ריק ב-PHP?

גם empty($arr) וגם $arr === [] עובדים, וכך גם count($arr) === 0. empty() מחזירה true גם כשהמשתנה לא מוגדר, בעוד count() על משתנה לא מוגדר הייתה מזהירה ואז זורקת TypeError עבור null.

מתי להשתמש ב-empty() במקום ב-isset()?

השתמשו ב-isset() כשצריך לדעת רק שערך קיים (תיבת סימון נשלחה, מפתח הגדרות נמצא). השתמשו ב-!empty() כשהערך חייב גם לא להיות ריק, למשל שדה טקסט חובה. היזהרו בשדות שבהם 0 תקין, כי empty('0') הוא true.

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

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

להתחיל