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