الاختزال باستخدام 'array_reduce'
جزء من قسم المنطق وتدفق التنفيذ في رحلة PHP على Coddy. الدرس 43 من 68.
تتبع الدالة array_reduce() نهجًا مختلفًا عن array_map() وarray_filter(). فبدلًا من إرجاع مصفوفة جديدة، تعالج جميع العناصر في مصفوفة لإنتاج قيمة واحدة. وهذا يجعلها مثالية لعمليات مثل حساب المجاميع، والعثور على القيم القصوى، أو دمج جميع العناصر في نتيجة واحدة.
تأخذ الدالة المصفوفة المراد معالجتها ودالة رد نداء تحدد كيفية دمج العناصر، بالإضافة إلى مَعلمة ثالثة اختيارية: القيمة الأولية. وتتلقى دالة رد النداء مَعلمين: النتيجة المتراكمة (وتُسمى "carry") وعنصر المصفوفة الحالي.
<?php
function addNumbers($carry, $item) {
return $carry + $item;
}
$numbers = [1, 2, 3, 4, 5];
$sum = array_reduce($numbers, "addNumbers", 0);
// النتيجة: 15
?>في هذا المثال، تبدأ الدالة بقيمة ابتدائية مقدارها 0، ثم تستدعي addNumbers بشكل متكرر باستخدام المجموع الجاري وكل عنصر من عناصر المصفوفة. تستمر عملية التجميع هذه حتى تتم معالجة جميع العناصر، لتبقى لديك القيمة النهائية المختزلة.
التحدي
سهلستتلقى مُدخلين: قائمة أرقام مفصولة بفواصل ونوع العملية. يحتوي المُدخل الأول على أرقام كسلسلة نصية بالتنسيق 5,10,15,20,25، أما المُدخل الثاني فهو حرف واحد يحدد العملية: S للجمع، أو P للضرب، أو M لإيجاد القيمة العظمى.
اقرأ المُدخلين، وحوّل الأرقام المفصولة بفواصل إلى مصفوفة من الأعداد الصحيحة، وأنشئ دالة رد نداء مخصصة تنفذ العملية المحددة، واستخدم array_reduce() مع دالة رد النداء والقيمة الابتدائية المناسبة لمعالجة جميع الأرقام للحصول على نتيجة واحدة، ثم اطبع النتيجة النهائية.
تفاصيل العمليات:
S(الجمع): اجمع كل الأرقام (القيمة الابتدائية: 0)P(الضرب): اضرب كل الأرقام بعضها في بعض (القيمة الابتدائية: 1)M(القيمة العظمى): أوجد أكبر رقم (القيمة الابتدائية: أول رقم في المصفوفة أو رقم صغير جدًا)
يجب أن تقبل دالة رد النداء وسيطين: النتيجة المتراكمة (carry) وعنصر المصفوفة الحالي (item)، ثم تعيد القيمة المتراكمة المحدّثة وفقًا لنوع العملية.
تنسيق الإدخال:
- السطر الأول: أرقام مفصولة بفواصل (مثال:
5,10,15,20,25) - السطر الثاني: نوع العملية - إما
SأوPأوM(مثال:S)
المخرجات المتوقعة: رقم واحد يمثل نتيجة عملية الاختزال
جرّب بنفسك
<?php
// اقرأ المدخلات
$numbers_input = trim(fgets(STDIN));
$operation = trim(fgets(STDIN));
// حوّل السلسلة المفصولة بفواصل إلى مصفوفة من الأعداد الصحيحة
$numbers = array_map('intval', explode(',', $numbers_input));
// TODO: اكتب الكود الخاص بك أدناه
// أنشئ دالة رد نداء بناءً على نوع العملية
// استخدم array_reduce() مع دالة رد النداء الخاصة بك وقيمة ابتدائية مناسبة
// اطبع النتيجة
echo $result;
?>يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المنطق وتدفق التنفيذ
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'ملخص: معالجة البياناتتدرّب بنفسك: مترجم PHP عبر الإنترنت