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

الدالة array_map() في PHP: تطبيق دالة على كل عنصر

تستدعي array_map($callback, $array) دالة الاستدعاء على كل عنصر وتعيد مصفوفة جديدة بالنتائج. تعلّم الدوال السهمية، والمفاتيح، والمرور على عدة مصفوفات معًا، ومتى تناسب array_walk أو foreach أكثر.

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

تستدعي array_map($callback, $array) الدالة $callback على كل عنصر في $array وتعيد مصفوفة جديدة بالنتائج. دالة الاستدعاء أولًا، والمصفوفة ثانيًا، وتبقى المصفوفة الأصلية دون تغيير.

fn($p) => $p * 1.2 دالة سهمية: دالة من تعبير واحد تعيد نتيجته. ويعمل أي شيء قابل للاستدعاء مكانها.

استخدام دالة مدمجة دالةَ استدعاء

مرّر اسم دالة مدمجة نصًا. هذه أقصر طريقة لتنظيف مصفوفة كاملة: تشذيب كل قيمة، أو تحويل النصوص إلى أعداد صحيحة، أو تغيير حالة الأحرف.

array_map('intval', ...) هي الطريقة المعتادة لتحويل النصوص القادمة من نموذج أو من explode() إلى أعداد صحيحة حقيقية. ويمكنك أيضًا كتابة intval(...)، صيغة الاستدعاء من الدرجة الأولى منذ PHP 8.1، التي يستطيع محررك إكمالها تلقائيًا وفحصها.

استخدام دالة مغلقة مع متغيرات خارجية

ترى الدالة السهمية المتغيرات المحيطة بها تلقائيًا. أما function الكلاسيكية فتحتاج إلى use لإدخالها. كلتاهما مشروحة في صفحة الدوال المجهولة.

array_map مع المفاتيح

مع مصفوفة واحدة، تحتفظ array_map بالمفاتيح، بما فيها المفاتيح النصية. لكن دالة الاستدعاء لا تتلقى إلا القيمة. وللحصول على المفتاح أيضًا، مرّر array_keys($array) مصفوفةً ثانية: عندها تُستدعى الدالة بعنصر واحد من كل مصفوفة.

لاحظ النتيجة الثانية: حالما تمرر أكثر من مصفوفة، تُستبدل المفاتيح بـ 0, 1, 2. لهذا يستخدم السطر الأخير array_combine() لإعادة بنائها.

المرور على عدة مصفوفات معًا

تصبح كل مصفوفة إضافية وسيطًا إضافيًا لدالة الاستدعاء، مطابقًا حسب الموضع. وإذا اختلفت أطوال المصفوفات، تُكمَّل الأقصر بـ null.

تمرير null دالةَ استدعاء يتخطى الدالة ويضم المصفوفات أزواجًا:

array_map مقابل array_walk مقابل foreach

تبني array_map مصفوفة جديدة. وتغيّر array_walk المصفوفة التي تمررها، عبر مرجع، وتعطي دالة الاستدعاء المفتاح وسيطًا ثانيًا. وتفعل foreach أيًّا منهما، وتستطيع أيضًا تخطي عناصر أو التوقف مبكرًا بـ break.

استخدم array_map عندما يتحول كل عنصر إلى عنصر جديد واحد بالضبط. وإذا احتجت أيضًا إلى إسقاط بعض العناصر، فاجمعها مع array_filter، أو اكتب foreach.

خطأ شائع: ترتيب الوسائط

تأخذ array_map دالة الاستدعاء أولًا والمصفوفة ثانيًا. وجارتها array_filter تأخذهما بالترتيب المعاكس، فيسهل الخلط بينهما:

array_map($callback, $array);     // callback first
array_filter($array, $callback);  // array first

تبديلهما يجعل PHP 8 ترمي TypeError، لأن المصفوفة العادية ليست دالة استدعاء صالحة:

تتوقف PHP مع:

PHP Fatal error:  Uncaught TypeError: array_map(): Argument #1 ($callback) must be a valid callback or null, array callback must have exactly two members in /home/index.php:4

أعد الوسيطين إلى مكانيهما فتعمل الكتلة.

الأسئلة الشائعة

ماذا تفعل array_map في PHP؟

تستدعي دالة على كل عنصر في مصفوفة وتعيد مصفوفة جديدة بالنتائج: تعيد array_map(fn($n) => $n * 2, [1, 2, 3]) المصفوفة [2, 4, 6]. ولا تتغير المصفوفة الأصلية.

هل تحتفظ array_map بالمفاتيح؟

مع مصفوفة واحدة، نعم: تبقى المفاتيح النصية والصحيحة كما هي. ومع مصفوفتين أو أكثر، تحصل النتيجة دائمًا على مفاتيح جديدة 0, 1, 2....

كيف أحصل على المفتاح داخل دالة الاستدعاء في array_map؟

مرّر المفاتيح مصفوفةً ثانية: array_map(fn($k, $v) => "$k=$v", array_keys($arr), $arr). النتيجة قائمة، لذا ضعها داخل array_combine(array_keys($arr), ...) إذا احتجت إلى استعادة المفاتيح الأصلية.

هل array_map أسرع من foreach؟

ليس بفرق يُذكر. كلتاهما تمر على المصفوفة مرة واحدة، وكثيرًا ما تكون foreach العادية أسرع قليلًا لأنها تتجنب استدعاء دالة لكل عنصر. اختر array_map عندما تكون أوضح للقراءة: تحويل واحد ينتج مصفوفة جديدة.

ما الفرق بين array_map وarray_walk؟

تعيد array_map مصفوفة جديدة وتترك المُدخل كما هو. أما array_walk فتعيد true وغرضها تغيير المصفوفة في مكانها عبر معامل بالمرجع: array_walk($arr, function (&$v, $k) { $v = trim($v); });.

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

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

ابدأ الآن