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

المرور عبر العناصر باستخدام 'array_walk'

جزء من قسم Logic & Flow في رحلة PHP على Coddy — الدرس 44 من 68.

توفر الدالة array_walk() نهجاً مختلفاً لمعالجة المصفوفات مقارنة بـ array_map(). فبينما تقوم array_map() بإنشاء مصفوفة جديدة بقيم محولة، تقوم array_walk() بتعديل المصفوفة الأصلية مباشرة عن طريق تطبيق دالة استدعاء (callback function) على كل عنصر في مكانه.

هذه الوظيفة مفيدة بشكل خاص عندما تريد تغيير المصفوفة الموجودة دون إنشاء نسخة. تتلقى وظيفة callback التي توفرها كل عنصر من عناصر المصفوفة عن طريق المرجع (by 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 لاستلام عنصر المصفوفة عن طريق المرجع. يتيح ذلك للدالة تعديل عنصر المصفوفة الأصلي مباشرةً. يوفر المعامل الثاني $key إمكانية الوصول إلى مفتاح العنصر الحالي، على الرغم من أنه ليس مطلوباً دائماً للتحويلات البسيطة.

تقبل الدالة array_walk() أيضًا وسيطًا ثالثًا اختياريًا — وهو عبارة عن بيانات إضافية يتم تمريرها مباشرةً إلى وظيفة الاستدعاء (callback) كمعامل ثالث. هذا مفيد عندما يعتمد التحويل الخاص بك على قيمة محددة خارج المصفوفة.


<?php
function addPrefix(&$value, $key, $prefix) {
    $value = $prefix . $value;
}

$items = ["apple", "banana", "orange"];
array_walk($items, "addPrefix", "Item: ");
// $items is now: ["Item: apple", "Item: banana", "Item: orange"]
?>

هنا، يتم تمرير السلسلة النصية "Item: " كوسيط ثالث للدالة array_walk() ويتم استقبالها كـ $prefix داخل وظيفة الاستدعاء. يتيح لك ذلك إعادة استخدام نفس وظيفة الاستدعاء مع قيم إضافية مختلفة.
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

challenge icon

التحدي

سهل

ستتلقى مدخلين: قائمة بأسماء المنتجات مفصولة بفاصلة، وبادئة للفئة (category prefix). يحتوي المدخل الأول على أسماء المنتجات كسلسلة نصية بتنسيق laptop,mouse,keyboard,monitor، والمدخل الثاني هو نص بادئة الفئة (مثال: Electronics).

اقرأ كلا المدخلين، وقم بتحويل أسماء المنتجات المفصولة بفاصلة إلى مصفوفة، ثم أنشئ دالة استدعاء (callback function) تضيف بادئة الفئة إلى كل اسم منتج بالتنسيق "Category: ProductName"، واستخدم array_walk() مع دالة الاستدعاء الخاصة بك لتعديل المصفوفة الأصلية مباشرة، واطبع كل اسم منتج معدل في سطر منفصل.

يجب أن تستخدم دالة الاستدعاء الخاصة بك المعامل &$value لتعديل عناصر المصفوفة عن طريق المرجع (by reference). يجب أن تقوم الدالة بدمج بادئة الفئة مع نقطتين مسافتين، متبوعة باسم المنتج.

تنسيق المدخلات:

  • السطر الأول: أسماء المنتجات مفصولة بفاصلة (مثال: laptop,mouse,keyboard,monitor)
  • السطر الثاني: نص بادئة الفئة (مثال: Electronics)

المخرجات المتوقعة: طباعة كل اسم منتج معدل في سطر منفصل بالتنسيق Category: ProductName

ورقة مرجعية

تقوم الدالة array_walk() بتعديل المصفوفة الأصلية مباشرةً عن طريق تطبيق دالة استدعاء (callback function) على كل عنصر في مكانه، على عكس array_map() التي تنشئ مصفوفة جديدة.

تستقبل دالة الاستدعاء كل عنصر من عناصر المصفوفة عن طريق المرجع (reference) باستخدام &$value، مما يسمح بالتعديل المباشر للقيم الأصلية. المعامل الثاني $key يوفر إمكانية الوصول إلى مفتاح العنصر الحالي.

تقبل array_walk() أيضاً وسيطاً ثالثاً اختيارياً — وهو بيانات إضافية يتم تمريرها إلى دالة الاستدعاء كمعامل ثالث. هذا مفيد عندما تحتاج دالة الاستدعاء الخاصة بك إلى معلومات إضافية لمعالجة كل عنصر.

<?php
function addPrefix(&$value, $key) {
    $value = "Item: " . $value;
}

$items = ["apple", "banana", "orange"];
array_walk($items, "addPrefix");
// $items is now: ["Item: apple", "Item: banana", "Item: orange"]

// Using the optional third argument (extra data):
function applyPrefix(&$value, $key, $prefix) {
    $value = $prefix . $value;
}

$fruits = ["apple", "banana", "orange"];
array_walk($fruits, "applyPrefix", "Fresh: ");
// $fruits is now: ["Fresh: apple", "Fresh: banana", "Fresh: orange"]
?>

جرّب بنفسك

<?php
// قراءة أسماء المنتجات المفصولة بفاصلة
$products_input = trim(fgets(STDIN));

// قراءة بادئة الفئة
$category = trim(fgets(STDIN));

// تحويل السلسلة النصية المفصولة بفاصلة إلى مصفوفة
$products = explode(',', $products_input);

// TODO: اكتب الكود الخاص بك أدناه
// قم بإنشاء دالة استدعاء (callback function) تقوم بتعديل اسم كل منتج عن طريق إضافة بادئة الفئة
// استخدم ()array_walk مع دالة الاستدعاء الخاصة بك لتعديل المصفوفة


// إخراج كل اسم منتج معدل في سطر منفصل
foreach ($products as $product) {
    echo $product . "\n";
}
?>
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Logic & Flow