Menu

array_key_exists() ב-PHP: בדיקה אם מפתח קיים במערך

array_key_exists('key', $array) מחזירה true כשלמערך יש את המפתח הזה, גם אם הערך שלו null. isset($array['key']) מהירה יותר אבל מחזירה false לערך null. למדו את ההבדל, key_exists(), מפתחות מקוננים, בדיקת כמה מפתחות, ולמה אובייקטים צריכים property_exists().

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

array_key_exists('key', $array) מחזירה true אם למערך יש את המפתח הזה ו-false אם אין. שימו לב לסדר: המפתח בא ראשון, המערך שני. היא מחזירה true גם כשהערך שנשמר תחת המפתח הוא null, וזה הדבר היחיד ש-isset() לא עושה.

כדי לבדוק ערך ולא מפתח, השתמשו ב-in_array().

array_key_exists מול isset

שתיהן בודקות מפתח. הן חלוקות רק כשהערך הוא null: isset() מתייחסת לערך null כ"לא מוגדר", array_key_exists() מדווחת על מה שבאמת נמצא במערך.

0 ו-'' נחשבים מוגדרים אצל שתיהן; רק null מפריד ביניהן. מה שאתם רוצים תלוי במה ש-null אומר בנתונים שלכם:

  • השתמשו ב-isset() כש-null אומר "אין ערך". זה המקרה הנפוץ, זה מבנה שפה (מעט מהיר יותר), והוא מקבל נתיבים מקוננים ומשתנים לא מוגדרים בלי אזהרה.
  • השתמשו ב-array_key_exists() כש-null הוא ערך אמיתי שצריך להבדיל ממפתח חסר: שדה JSON שנשלח כ-null, עמודת מסד נתונים שהיא NULL, אפשרות שהוגדרה במפורש כ-null כדי לנקות אותה.

עמוד isset מכסה את השימושים האחרים שלה, כולל בדיקה של כמה משתנים בבת אחת.

הבחנה בין null לבין חסר במטען JSON

מקרה טיפוסי שבו רק array_key_exists() נותנת את התשובה הנכונה: API שמעדכן רשומה מ-JSON. שדה שנשלח כ-null אומר "נקה אותו", שדה שלא נשלח אומר "אל תיגע בו". isset() רואה את שניהם כאותו דבר.

עם isset($patch[$field]) מספר הטלפון היה נשאר, כי ה-null היה נראה כמו שדה חסר.

key_exists() היא אותה פונקציה

key_exists() היא כינוי של array_key_exists(), שנשמר מימי PHP המוקדמים. אותם ארגומנטים, אותה תוצאה. העדיפו את השם המלא, שאותו קוראים מצפים לראות.

טיפוסי מפתחות: "1" ו-1 הם אותו מפתח

מפתחות מערך הם מספרים שלמים או מחרוזות, ומחרוזת שהיא מספר שלם עשרוני פשוט נשמרת כמספר שלם. לכן array_key_exists('1', $arr) מוצאת את המפתח 1, וגם להפך. מחרוזת כמו '01' נשארת מחרוזת והיא מפתח אחר.

בדיקת מפתחות מקוננים וכמה מפתחות

array_key_exists() מסתכלת על רמה אחת. לנתיב מקונן שבו null לא משנה, isset($a['x']['y']) בודקת כל רמה בבת אחת. לנתיב שבו הוא כן משנה, פונקציית עזר קצרה עוברת על הרמות. כדי לבדוק שכמה מפתחות קיימים כולם, השוו מול array_diff_key().

array_flip($required) הופכת את רשימת השמות למפתחות כדי ש-array_diff_key() תוכל להשוות אותם למפתחות של הקלט; מה שנשאר הוא רשימת השדות החסרים, מוכנה להודעת שגיאה.

אובייקטים צריכים property_exists

גרסאות PHP ישנות קיבלו אובייקט ב-array_key_exists(). PHP 8 זורקת במקום זאת TypeError. לאובייקטים, property_exists() בודקת מאפיין מוצהר או דינמי (גם כזה שמוגדר כ-null), ו-isset($obj->prop) עובדת כמו isset() על מערכים.

שתי השורות האחרונות מראות את הדרך האחרת: get_object_vars() הופכת את המאפיינים הנגישים של האובייקט למערך, ואז פונקציות המערך חלות עליו.

שאלות נפוצות

למה isset מחזירה false כש-array_key_exists מחזירה true?

המפתח מחזיק null. isset($arr['k']) היא true רק אם המפתח קיים והערך שלו אינו null, בעוד array_key_exists('k', $arr) היא true בכל פעם שהמפתח נמצא במערך. לכל ערך אחר, כולל 0, '' ו-false, שתיהן מחזירות אותה תשובה.

מה זה key_exists ב-PHP?

כינוי של array_key_exists(). key_exists('id', $row) ו-array_key_exists('id', $row) מתנהגות אותו דבר. רוב הקוד משתמש בשם הארוך.

איך בודקים אם מפתח מקונן קיים ב-PHP?

בדקו כל רמה: isset($data['user']['address']['city']) בודקת את כל הנתיב בבת אחת ואף פעם לא מזהירה כשרמה חסרה. אם ערכי null צריכים להיחשב קיימים, עברו על הנתיב עם array_key_exists() רמה אחר רמה.

אפשר להשתמש ב-array_key_exists על אובייקט?

לא. מאז PHP 8.0 העברה של אובייקט זורקת TypeError. השתמשו ב-property_exists($obj, 'name') למאפיינים מוצהרים, או ב-isset($obj->name).

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

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

להתחיל