الاختزال باستخدام '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 للمجموع (sum)، أو P للضرب (product)، أو M للحد الأقصى (maximum).
اقرأ كلا المدخلين، وقم بتحويل الأرقام المفصولة بفاصلة إلى مصفوفة من الأعداد الصحيحة، وأنشئ دالة استدعاء (callback function) مخصصة تنفذ العملية المحددة، واستخدم array_reduce() مع دالة الاستدعاء الخاصة بك وقيمة أولية مناسبة لمعالجة جميع الأرقام في نتيجة واحدة، ثم اطبع النتيجة النهائية.
تفاصيل العمليات:
S(المجموع): جمع كل الأرقام معاً (القيمة الأولية: 0)P(الضرب): ضرب كل الأرقام معاً (القيمة الأولية: 1)M(الحد الأقصى): العثور على أكبر رقم (القيمة الأولية: الرقم الأول في المصفوفة أو رقم صغير جداً)
يجب أن تقبل دالة الاستدعاء الخاصة بك معاملين: النتيجة المتراكمة (carry) وعنصر المصفوفة الحالي (item)، ثم تعيد القيمة المتراكمة المحدثة بناءً على نوع العملية.
تنسيق المدخلات:
- السطر الأول: أرقام مفصولة بفاصلة (مثال:
5,10,15,20,25) - السطر الثاني: نوع العملية - إما
S، أوP، أوM(مثال:S)
المخرج المتوقع: رقم واحد يمثل نتيجة عملية الـ reduce
ورقة مرجعية
تقوم الدالة array_reduce() بمعالجة جميع العناصر في المصفوفة لإنتاج قيمة واحدة، وهي مثالية لحساب الإجماليات أو دمج العناصر.
تتطلب هذه الدالة ثلاثة معاملات: المصفوفة المراد معالجتها، ودالة استدعاء (callback function)، وقيمة أولية اختيارية. تستقبل دالة الاستدعاء النتيجة المتراكمة (carry) والعنصر الحالي في المصفوفة.
<?php
function addNumbers($carry, $item) {
return $carry + $item;
}
$numbers = [1, 2, 3, 4, 5];
$sum = array_reduce($numbers, "addNumbers", 0);
// النتيجة: 15
?>استخدم number_format($total, 2) لتنسيق النتائج إلى منزلتين عشريتين.
جرّب بنفسك
<?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'ملخص: معالجة البيانات