Menu
flag Ar iconالعربيةdown icon

الدالة 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(): واجهة برمجية تحدّث سجلًا من 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

ابدأ الآن