انتقل إلى محتوى الدرس
الدرس 35
دورة PHP

معالجة المصفوفات الوظيفية عبر array_map و array_filter و array_reduce في PHP 8.4PHP Functional Array Operations map filter reduce and find

حوّل وصفِّ واجمع بيانات المصفوفات باحترافية في PHP 8.4 باستخدام array_map وarray_filter وarray_reduce وarray_column وarray_find.
أقسام الدرس
6
الأمثلة
6
اللغة
العربية
تاريخ النشر
غير محدد
المشاهدات
0
محتوى الدرس
في هذا الدرس 6تصفّح المواضيع

تستخرج الدالة array_column($records, $columnKey, $indexKey) عموداً واحداً من مصفوفة السجلات ثنائية الأبعاد، أو تعيد فهرسة السجلات بمفتاح فريد مثل "id".

  • مرر اسم العمود في المعامل الثاني للحصول على قائمة مسطحة بالقيم (مثل array_column($users, "email")).
  • مرر المعامل الثالث ($indexKey) لبناء قاموس ترابطي مفهرس بقيمة ذلك العمود (مثل [101 => "[email protected]"]).
  • مرر null في المعامل الثاني مع تحديد $indexKey لفهرسة الصفوف الكاملة بمعرفها الفريد.

تستخرج الاستدعاءة الأولى قائمة بأسماء المنتجات، بينما تربط الثانية كل معرف "id" بسعره "price" مباشرة.

مخطط توضيحي: محاكي خطوط معالجة المصفوفات (الاستخراج والتصفية والتجميع) في PHP
PHP
<?php
$products = [
    ["id" => 10, "name" => "Router", "price" => 120],
    ["id" => 20, "name" => "Switch", "price" => 85],
];

$names     = array_column($products, "name");
$priceById = array_column($products, "price", "id");

echo "Names: " . implode(", ", $names) . "\n";
echo "Product #20 price: $" . $priceById[20] . "\n";

قبل عرض البيانات الكبيرة، ادمج التحويل النصي عبر array_map() مع دالتي array_slice() وarray_chunk() لتوحيد وتقسيم السجلات.

  • تطبّق array_map("trim", $items) أو array_map("strtoupper", $codes) دالة مدمجة على كل عنصر وترجع مصفوفة جديدة محولة.
  • تقتطع array_slice($items, $offset, $perPage) صفحة محددة من القائمة بعد تنظيفها.
  • تقسّم array_chunk($items, $size) القائمة الموحدة إلى مجموعات ثابتة الحجم للمعالجة الدفعية.

تزيل array_map() المسافات الزائدة وتحول جميع الأكواد لأحرف كبيرة قبل اقتطاعها بـ array_slice() وتقسيمها بـ array_chunk().

PHP
<?php
$rawCodes = ["   discount10 ", "vip20 ", " flash30", "welcome5  "];
$clean    = array_map("strtoupper", array_map("trim", $rawCodes));

$topTwo = array_slice($clean, 0, 2);
$rows   = array_chunk($clean, 2);

echo "Top 2 : " . implode(", ", $topTwo) . "\n";
echo "Row 2 : " . implode(", ", $rows[1]) . "\n";

تقوم خطوط استيراد البيانات بتوحيد عناوين الأعمدة عبر array_map()، وربطها بالصفوف عبر array_combine()، والتحقق من الأعمدة الإلزامية عبر array_diff().

  • استخدم array_map("strtolower", $headers) لتوحيد حالة أحرف عناوين الأعمدة قبل استدعاء array_combine().
  • استخدم array_diff($requiredCols, array_keys($record)) للتحقق من عدم غياب أي حقل إلزامي.
  • عندما ترجع array_diff() مصفوفة فارغة []، فهذا يؤكد وجود جميع المفاتيح المطلوبة.

تم تهذيب الرؤوس وتحويلها لأحرف صغيرة وربطها بالقيم، ثم كشفت array_diff() أن المفتاح الإلزامي "tax" مفقود.

PHP
<?php
$rawHeaders = [" SKU ", "Price", "Stock"];
$headers    = array_map("strtolower", array_map("trim", $rawHeaders));
$values     = ["MON-4K", 349.99, 12];

$record  = array_combine($headers, $values);
$missing = array_diff(["sku", "price", "tax"], array_keys($record));

echo "Mapped SKU : " . $record["sku"] . "\n";
echo "Missing key: " . implode(", ", $missing) . "\n";

إن استدعاء array_filter($array) بدون معامل ثانٍ يحذف تلقائياً جميع القيم الفارغة أو الخاطئة منطقياً ("" وnull وfalse و0 و"0" و[]).

  • ادمج array_map("trim", $inputs) مع array_filter() لحذف النصوص الفارغة أو التي تحتوي على مسافات فقط.
  • لأن array_filter() تحتفظ بالمفاتيح الأصلية، غلّف الناتج بـ array_values() للحصول على ترقيم متسلسل نظيف 0, 1, 2....
  • احذر عند تصفية مصفوفات الأرقام التي يُعد فيها الصفر 0 قيمة صالحة؛ لأن array_filter($scores) الافتراضية تحذف 0 و"0"!

تحول array_map("trim", ...) المسافات الفارغة إلى نص فارغ ""، فتحذفها array_filter() وتعيد array_values() ترقيم الوسوم الثلاثة المتبقية.

مخطط تدفق التنفيذ العملي لقسم تصفية العناصر الفارغة وإعادة الترقيم بـ array_values في لغة PHP
PHP
<?php
$rawTags = ["php", "", "   ", null, "laravel", false, "mysql"];
$trimmed = array_map("trim", $rawTags);
$clean   = array_values(array_filter($trimmed));

echo "Count : " . count($clean) . "\n";
echo "Values: " . implode(", ", $clean) . "\n";

بدلاً من تعريف متغيرات تجميع وكتابة حلقات يدوية، استخدم دوال التجميع المدمجة عالية الأداء: array_sum() وarray_product() وarray_count_values().

  • ترجع array_sum($numbers) المجموع الحسابي لجميع عناصر المصفوفة (وترجع 0 للمصفوفة الفارغة).
  • تضرب array_product($factors) جميع عناصر المصفوفة ببعضها (وترجع 1 للمصفوفة الفارغة).
  • تحسب array_count_values($items) عدد مرات تكرار كل قيمة نصية أو رقمية وترجع مصفوفة ترابطية بالتكرارات.

تجمع array_sum() إجمالي الطلبات ليصبح 250، وتبني array_count_values() خريطة تكرار تُظهر 3 طلبات مدفوعة وطلبين آخرين.

PHP
<?php
$lineTotals = [120.50, 79.50, 50.00];
$statuses   = ["paid", "pending", "paid", "paid", "failed"];

$revenue = array_sum($lineTotals);
$counts  = array_count_values($statuses);

echo "Total Revenue: $" . $revenue . "\n";
echo "Paid Orders  : " . $counts["paid"] . " | Pending: " . $counts["pending"] . "\n";

يتيح تسلسل دوال المصفوفات التصريحية بناء خطوط معالجة بيانات موجزة وموثوقة تستخرج وتحول وتصفي وتلخص البيانات في بضعة أسطر.

  • استخرج الأعمدة المطلوبة من السجلات المتداخلة أولاً عبر array_column().
  • حوّل القيم ونظفها عبر array_map()، ثم احذف المدخلات الفارغة عبر array_filter().
  • احسب الإجماليات النهائية أو مرات التكرار باستخدام array_sum() أو count() أو array_count_values().

يستخرج خط المعالجة عمود "coupon"، ويهذب النصوص ويحولها لأحرف كبيرة، ثم يحذف النص الفارغ ويحسب عدد مرات استخدام الكوبون "SAVE10".

الدالةالمدخلاتالمخرجاتحالة الاستخدام الأساسية
array_column($rows, $col, $idx)مصفوفة ثنائية من السجلاتمصفوفة أحادية أو فهرس بحثاستخراج عمود محدد أو فهرسة السجلات بالمعرف
array_map($callback, $arr)دالة تحويل + مصفوفةمصفوفة جديدة محوَّلةتوحيد وتنسيق النصوص أو الأرقام لكل العناصر
array_filter($arr)مصفوفةمصفوفة مصفاة مع حفظ المفاتيحاستبعاد القيم الفارغة أو غير المطابقة للشرط
array_sum($arr)مصفوفة رقميةint | floatحساب المجموع الكلي للأرقام
array_count_values($arr)مصفوفة نصوص أو أعدادمصفوفة ترابطية لعدد التكراراتإحصاء عدد مرات ظهور كل قيمة
PHP
<?php
$orders = [
    ["coupon" => " save10 ", "amount" => 80],
    ["coupon" => "",         "amount" => 120],
    ["coupon" => "SAVE10",   "amount" => 100],
];

$coupons = array_filter(array_map("strtoupper", array_map("trim", array_column($orders, "coupon"))));
$usage   = array_count_values($coupons);

echo "Total Sales: $" . array_sum(array_column($orders, "amount")) . "\n";
echo "SAVE10 used: " . $usage["SAVE10"] . " times\n";
خلاصة المعرفة ومحطة الانتقال

ملخص الدرس

حصاد الدرس

مراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي

ماذا تعلّمت في هذا الدرس؟

يتيح تسلسل دوال المصفوفات التصريحية بناء خطوط معالجة بيانات موجزة وموثوقة تستخرج وتحول وتصفي وتلخص البيانات في بضعة أسطر. استخرج الأعمدة المطلوبة من السجلات المتداخلة أولاً عبر array_column(). حوّل القيم ونظفها عبر array_map()، ثم احذف المدخلات الفارغة عبر array_filter(). احسب الإجماليات النهائية أو مرات التكرار باستخدام array_sum() أو count() أو array_count_values().

مشاركة

هل كان هذا الدرس مفيدًا؟

جارٍ تحميل الآراء…

ابنِ لغتك البرمجية

المصطلحات4

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 4 مفهومةأول بطاقة، أول خطوة
01 Map, Filter & Reduce الدوال array_map و filter
حوّل وصفِّ واجمع بيانات المصفوفات باحترافية في PHP 8.4 باستخدام array_map وarray_filter وarray_reduce وarray_column وarray_find.
للمراجعة
02 Extracting Columns with array_column استخراج الأعمدة وإعادة الفهرسة بـ array_column
المفهوم الأساسي لقسم استخراج الأعمدة وإعادة الفهرسة بـ array_column في لغة PHP الحديثة.
للمراجعة
03 Slicing and Chunking with array_slice اقتطاع وتقسيم المصفوفات بـ array_slice و array_chunk
الصياغة البرمجية والتطبيق العملي المباشر لقسم اقتطاع وتقسيم المصفوفات بـ array_slice و array_chunk.
للمراجعة
04 Combining and Diffing Arrays ربط المفاتيح بالقيم بـ array_combine وحساب الفروق
قواعد التحقق وأفضل الممارسات القياسية الخاصة بقسم ربط المفاتيح بالقيم بـ array_combine وحساب الفروق.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

حروف قليلة. معنى كامل.

الاختصارات4

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 4 مفهومةأول بطاقة، أول خطوة
01 PHP PHP
PHP: Hypertext Preprocessor
لغة البرمجة النصية على جانب الخادم لبناء تطبيقات الويب الديناميكية وواجهات البرمجة.
للمراجعة
02 CLI CLI
Command-Line Interface
واجهة سطر الأوامر التي تتيح تشغيل ملفات PHP مباشرة عبر الطرفية.
للمراجعة
03 FPM FPM
FastCGI Process Manager
مدير عمليات FastCGI عالي الأداء لمعالجة طلبات خادم الويب في PHP.
للمراجعة
04 HTML HTML
HyperText Markup Language
لغة الترميز القياسية التي يولدها محرك PHP ويرسلها إلى متصفح العميل بعد التنفيذ.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

من الفهم للتطبيق

مهامك قبل الاختبار

خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.

0/2مهام منجزة
  1. أنشئ ملف PHP محلياً ونفّذ المثال البرمجي المشروح في قسم استخراج الأعمدة وإعادة الفهرسة بـ array_column للتحقق من المخرجات.

  2. بدّل بين الحالات الثلاث في المحاكي التفاعلي ضمن قسم اقتطاع وتقسيم المصفوفات بـ array_slice و array_chunk وقارن مخرجات التنفيذ.

تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.

مساحة التحدي

اختبر فهمك.
ووصلها للإتقان.

كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.

8أسئلة 1أنواع تحديات 100%هدف الإتقان
تصحيح تلقائي. فرص بلا حدود.

أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.

الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.

لمحة عن التحدي8 أسئلة تنتظرك
01

أي استدعاء يستخرج الحقل "email" من كل صف في $users ويفهرس المصفوفة الناتجة بمعرف كل صف "id"؟

المعامل الثاني هو عمود القيمة ("email") والمعامل الثالث هو عمود الفهرسة ("id").

02

ما الذي ترجعه التعليمة array_column($rows, null, "id")؟

تمرير null كمعامل ثانٍ يوجه array_column() لإرجاع كل صف كامل مفهرساً بالمعامل الثالث.

03

ما القيم التي يتم حذفها عند استدعاء array_filter($items) بدون تمرير دالة رد نداء؟

بدون دالة مخصصة، تحذف array_filter() كل عنصر تؤول قيمته المنطقية إلى false.

04

ماذا تفعل التعليمة array_map("trim", $names)؟

تطبق array_map() الدالة الممررة على كل عنصر وترجع المصفوفة المحولة.

05

ما الناتج الذي ترجعه الدالة array_count_values(["red", "blue", "red", "green", "red"])؟

ترجع array_count_values() مصفوفة ترابطية تربط كل قيمة فريدة بعدد مرات تكرارها.

06

ما القيمتان اللتان ترجعهما array_sum([]) وarray_product([]) عند تمرير مصفوفة فارغة؟

الصفر هو العنصر المحايد الجمعي والواحد هو العنصر المحايد الضربي.

07

ما القيد الخاص بنوع القيم داخل المصفوفة الممررة إلى دالة array_count_values()؟

لأن القيم المحسوبة تتحول إلى مفاتيح في المصفوفة المرجعة، فلا تقبل إلا int وstring.

08

لماذا يجب الحذر عند استدعاء array_filter($scores) بدون دالة مخصصة على قائمة درجات اختبار؟

في PHP تؤول القيمة 0 و"0" إلى false، فتحذفها array_filter() الافتراضية.