تعيد in_array($needle, $haystack) القيمة true إذا كانت القيمة في مكان ما من المصفوفة وfalse إن لم تكن. مرّر true وسيطًا ثالثًا، in_array($needle, $haystack, true)، لتشترط النوع نفسه أيضًا؛ وهذه الصيغة الصارمة هي التي ينبغي استخدامها افتراضيًا.
لا تنظر in_array() إلا إلى القيم. للتحقق من وجود مفتاح، استخدم array_key_exists() أو isset().
الوسيط strict
دون الوسيط الثالث، تقارن in_array() بـ ==، التي تحوّل الأنواع قبل المقارنة. ومع true، تقارن بـ ===: يجب أن تتطابق القيمة والنوع معًا. ويظهر الفرق حالما تجمع المصفوفة بين أعداد ونصوص، وهذا شائع مع بيانات النماذج والروابط وملفات CSV.
كل خلية أدناه هي ما تعيده == و=== لذلك الزوج من القيم في PHP 8.3. تجيب in_array() بـ true إذا أعطت القيمة المبحوث عنها وأي عنصر النتيجة true في الجدول للوضع الذي تستخدمه. بدّل بين التبويبات وانظر إلى صفوف null وtrue والنصوص الرقمية.
| $a == $b | true | false | null | 0 | 1 | "0" | "1" | "" | "abc" | "10" | "1e1" | 10 | [] |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| true | |||||||||||||
| false | |||||||||||||
| null | |||||||||||||
| 0 | |||||||||||||
| 1 | |||||||||||||
| "0" | |||||||||||||
| "1" | |||||||||||||
| "" | |||||||||||||
| "abc" | |||||||||||||
| "10" | |||||||||||||
| "1e1" | |||||||||||||
| 10 | |||||||||||||
| [] |
تغيّرت قاعدة واحدة في PHP 8: النص غير الرقمي لم يعد يساوي 0، لذا فإن in_array('abc', [0]) تساوي false اليوم لكنها كانت true في PHP 7. اعتمدت شيفرات كُتبت لـ PHP 7 على ذلك أحيانًا، وهذا سبب آخر لتمرير true وعدم الاعتماد على قواعد التحويل. تشرحها صفحة عوامل المقارنة كاملة.
in_array دون حساسية لحالة الأحرف
تقارن in_array() النصوص حرفيًا، لذا فإن 'PHP' و'php' مختلفتان. حوّل القيمة المبحوث عنها والمصفوفة إلى أحرف صغيرة قبل الفحص. وتتعامل mb_strtolower() مع الحروف ذات العلامات وغير اللاتينية أيضًا.
فحص عدة قيم معًا
تأخذ in_array() قيمة بحث واحدة. ولعدة قيم، قارن المصفوفات على أنها مجموعات: تعيد array_diff() القيم المفقودة، فالنتيجة الفارغة تعني أن كلها موجودة، وتعيد array_intersect() القيم التي وُجدت.
تقارن array_diff() وarray_intersect() القيم على أنها نصوص، لذا يُعدّ 1 و'1' متساويين هناك.
in_array على مصفوفة متعددة الأبعاد
لا تبحث in_array() داخل المصفوفات المتداخلة. للتحقق من أن أي صف يحتوي حقلًا بقيمة معينة، استخرج ذلك الحقل أولًا بـ array_column()، ثم ابحث في القائمة المسطحة.
يبيّن السطر الأخير أن القيمة المبحوث عنها يمكن أن تكون مصفوفة: فتطابق صفًا مماثلًا تمامًا، بالمفاتيح والقيم والترتيب نفسها.
in_array مقابل array_search مقابل isset
الثلاثة تجيب عن «هل هي موجودة؟»، لكنها تعيد أشياء مختلفة وتعمل بسرعات مختلفة:
| الاستدعاء | يعيد | السرعة على مصفوفة كبيرة |
|---|---|---|
in_array($v, $arr, true) | true أو false | تفحص كل عنصر |
array_search($v, $arr, true) | المفتاح، أو false | تفحص كل عنصر |
isset($set[$v]) | true أو false | بحث تجزئة واحد |
استخدم array_search() عندما تحتاج إلى معرفة مكان القيمة. وعندما تفحص قيمًا كثيرة مقابل القائمة الكبيرة نفسها، اقلب القائمة مرة واحدة لتصبح قيمها مفاتيح، واستخدم isset().
تتغير الأزمنة من تشغيل لآخر، لكن الفجوة لا تتغير: يبقى بحث isset() ثابتًا بينما يكبر in_array() مع حجم القائمة. لا تعمل array_flip() إلا مع القيم النصية والصحيحة، وتندمج التكرارات في مفتاح واحد، وهذا لا يهم في فحص العضوية.
الأسئلة الشائعة
ماذا يفعل الوسيط الثالث في in_array؟
يفعّل المقارنة الصارمة. تقارن in_array($x, $arr, true) بـ ===، فيجب أن يتطابق النوع والقيمة معًا: in_array('1', [1, 2], true) تساوي false. ومن دونه تقارن PHP بـ == وتحوّل الأنواع أولًا.
هل أستخدم الوضع الصارم دائمًا مع in_array؟
غالبًا نعم. في الوضع المرن تعيد in_array(null, [0]) وin_array(true, ['any string']) وin_array('1e1', ['10']) كلها true. لا تتركه معطلًا إلا عندما تريد عمدًا أن تطابق '5' القادمة من نموذج العدد الصحيح 5.
كيف أجعل in_array غير حساسة لحالة الأحرف؟
حوّل الطرفين إلى أحرف صغيرة: in_array(strtolower($needle), array_map('strtolower', $haystack), true). استخدم mb_strtolower عندما قد يحتوي النص على حروف غير ASCII.
كيف أتحقق من وجود عدة قيم في مصفوفة؟
لاشتراط وجودها كلها، تحقق من أنه لم يتبق شيء: !array_diff($needles, $haystack). ولاشتراط واحدة على الأقل، تحقق من وجود تقاطع: (bool) array_intersect($needles, $haystack).
هل in_array بطيئة؟
تفحص المصفوفة عنصرًا عنصرًا، لذا فهي بطيئة مع المصفوفات الكبيرة التي تُفحص مرات كثيرة. اقلب المصفوفة مرة واحدة بـ $set = array_flip($haystack); واستخدم isset($set[$value])، وهو بحث تجزئة واحد.