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

الدالة in_array() في PHP: هل القيمة موجودة في المصفوفة؟

تعيد in_array($needle, $haystack) القيمة true عندما تكون القيمة في المصفوفة. مرّر true وسيطًا ثالثًا لفحص صارم، in_array('1', $ids, true)، فيجب أن يتطابق النوع أيضًا. تعلّم الوسيط الصارم، والبحث دون حساسية لحالة الأحرف، وفحص عدة قيم، والمصفوفات المتداخلة، وبديل isset السريع.

تحتوي هذه الصفحة على محررات قابلة للتشغيل - حرّر، شغّل، وشاهد النتيجة فوراً.

تعيد 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 والنصوص الرقمية.

تطابقات in_array المرنة (==) مقابل الصارمة (===)
Point at or tap a cell to read it as PHP.
$a == $btruefalsenull01"0""1""""abc""10""1e1"10[]
true
false
null
0
1
"0"
"1"
""
"abc"
"10"
"1e1"
10
[]
Every cell computed by PHP 8.3.19.

تغيّرت قاعدة واحدة في 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])، وهو بحث تجزئة واحد.

رسم توضيحي للغات البرمجة في Coddy

تعلّم البرمجة مع Coddy

ابدأ الآن