المرور عبر العناصر باستخدام 'array_walk'
جزء من قسم Logic & Flow في رحلة PHP على Coddy — الدرس 44 من 68.
توفر الدالة array_walk() نهجاً مختلفاً لمعالجة المصفوفات مقارنة بـ array_map(). فبينما تقوم array_map() بإنشاء مصفوفة جديدة بقيم محولة، تقوم array_walk() بتعديل المصفوفة الأصلية مباشرة من خلال تطبيق دالة استدعاء (callback function) على كل عنصر في مكانه.
تُعد هذه الدالة مفيدة بشكل خاص عندما تريد تغيير المصفوفة الحالية دون إنشاء نسخة منها. تتلقى دالة الاستدعاء (callback function) التي توفرها كل عنصر من عناصر المصفوفة عن طريق المرجع (reference)، مما يسمح لك بتعديل القيم الأصلية مباشرة.
<?php
function addPrefix(&$value, $key) {
$value = "Item: " . $value;
}
$items = ["apple", "banana", "orange"];
array_walk($items, "addPrefix");
// $items الآن هي: ["Item: apple", "Item: banana", "Item: orange"]
?>لاحظ كيف تستخدم دالة الاستدعاء (callback function) &$value لاستقبال عنصر المصفوفة عن طريق المرجع (by reference). يتيح ذلك للدالة تعديل عنصر المصفوفة الأصلي مباشرةً. يوفر المعامل الثاني $key إمكانية الوصول إلى مفتاح العنصر الحالي، على الرغم من أنه ليس مطلوباً دائماً للتحويلات البسيطة.
تدعم array_walk() أيضاً وسيطاً ثالثاً اختيارياً يتيح لك تمرير بيانات إضافية مباشرة إلى دالة الاستدعاء (callback function) الخاصة بك. هذا مفيد عندما تعتمد عملية التحويل الخاصة بك على قيمة محددة خارج المصفوفة — مثل البادئة (prefix)، أو اللاحقة (suffix)، أو أي مدخل ديناميكي آخر.
عندما تقوم بتمرير وسيط ثالث إلى array_walk()، تستقبله دالة الاستدعاء (callback function) الخاصة بك كمعامل ثالث:
<?php
function addCategory(&$value, $key, $category) {
$value = $category . ": " . $value;
}
$products = ["laptop", "mouse", "keyboard"];
$prefix = "Electronics";
array_walk($products, "addCategory", $prefix);
// $products الآن هي: ["Electronics: laptop", "Electronics: mouse", "Electronics: keyboard"]
?>هنا، يتم تمرير $prefix كمعامل ثالث إلى array_walk()، وتستقبله الدالة المرجعية (callback) كـ $category. بهذه الطريقة، يمكنك إعادة استخدام نفس الدالة المرجعية مع بادئات مختلفة دون كتابة أي قيم بشكل ثابت بداخلها.
التحدي
سهلستتلقى مدخلين: قائمة بأسماء المنتجات مفصولة بفاصلة، وبادئة الفئة (category prefix). المدخل الأول يحتوي على أسماء المنتجات كسلسلة نصية بتنسيق laptop,mouse,keyboard,monitor، والمدخل الثاني هو نص بادئة الفئة (مثال: Electronics).
اقرأ كلا المدخلين، وحوّل أسماء المنتجات المفصولة بفاصلة إلى مصفوفة، ثم أنشئ دالة استدعاء (callback function) تضيف بادئة الفئة إلى كل اسم منتج بالتنسيق "Category: ProductName"، واستخدم array_walk() مع دالة الاستدعاء الخاصة بك لتعديل المصفوفة الأصلية مباشرة، واطبع كل اسم منتج معدل في سطر منفصل.
يجب أن تستخدم دالة الاستدعاء الخاصة بك المعامل &$value لتعديل عناصر المصفوفة عن طريق المرجع (by reference). يجب أن تقوم الدالة بدمج بادئة الفئة مع نقطتين ورأسيتين ومسافة، متبوعة باسم المنتج.
تنسيق المدخلات:
- السطر الأول: أسماء المنتجات مفصولة بفاصلة (مثال:
laptop,mouse,keyboard,monitor) - السطر الثاني: نص بادئة الفئة (مثال:
Electronics)
المخرجات المتوقعة: طباعة كل اسم منتج معدل في سطر منفصل بالتنسيق Category: ProductName
جرّب بنفسك
<?php
// قراءة أسماء المنتجات المفصولة بفاصلة
$products_input = trim(fgets(STDIN));
// قراءة بادئة الفئة (category prefix)
$category = trim(fgets(STDIN));
// تحويل السلسلة النصية المفصولة بفاصلة إلى مصفوفة
$products = explode(',', $products_input);
// TODO: اكتب كودك أدناه
// إنشاء دالة استدعاء (callback function) تقوم بتعديل اسم كل منتج عن طريق إضافة بادئة الفئة
// استخدم ()array_walk مع دالة الاستدعاء الخاصة بك لتعديل المصفوفة
// طباعة كل اسم منتج معدل في سطر منفصل
foreach ($products as $product) {
echo $product . "\n";
}
?>يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1الدوال المتقدمة
الدوال المجهولةالـ Closures وكلمة 'use'دوال السهمدوال الـ Callbackاستخدام 'call_user_func'دوال المتغيراتالتمرير بالمرجعالدوال العوديةمراجعة: مزيج الدوال4المصفوفات متعددة الأبعاد
إنشاء مصفوفة ثنائية الأبعادالوصول إلى عناصر المصفوفة ثنائية الأبعادتعديل عناصر المصفوفة ثنائية الأبعادالتكرار باستخدام الحلقات المتداخلةالمصفوفات الترابطية ثنائية الأبعادمراجعة: تمرين الشبكة البسيطة2معالجة المصفوفات المتقدمة
الإضافة باستخدام 'array_push'الحذف باستخدام 'array_pop'الإضافة باستخدام 'array_unshift'الحذف باستخدام 'array_shift'دمج المصفوفات المفهرسةدمج المصفوفات الترابطيةالاستخراج باستخدام 'array_slice'القيم باستخدام 'in_array'المفاتيح باستخدام 'array_search'مراجعة: تمرين قائمة التشغيل3ترتيب المصفوفات
ترتيب المصفوفات المفهرسة تصاعدياًترتيب المصفوفات المفهرسة تنازلياًترتيب المصفوفات الترابطية حسب القيمةترتيب المصفوفات الترابطية حسب المفتاحالترتيب بالترتيب الطبيعيالترتيب المخصص باستخدام 'usort'مراجعة: ترتيب لوحة المتصدرين6دوال المصفوفات من الرتبة العليا
التحويل باستخدام 'array_map''array_map' مع دالة مخصصةالتصفية باستخدام 'array_filter''array_filter' مع دالة مخصصةالاختزال باستخدام 'array_reduce'المرور عبر العناصر باستخدام 'array_walk'ملخص: معالجة البيانات