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).