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

دمج المصفوفات وربط المفاتيح وتقسيم الدفعات وحساب الفروق في PHPPHP Array Merging Combining Chunking and Set Differences

ادمج واستبدل عناصر المصفوفات بـ array_merge وarray_replace، واربط المفاتيح بالقيم عبر array_combine، واحسب التقاطع والاختلاف.
أقسام الدرس
6
الأمثلة
6
اللغة
العربية
تاريخ النشر
غير محدد
المشاهدات
0
محتوى الدرس
في هذا الدرس 6تصفّح المواضيع

تدمج كل من الدالة array_merge($a, $b) ومعامل اتحاد المصفوفات $a + $b المصفوفات معاً، لكنهما يعالجان تصادم المفاتيح المتكررة بطريقتين متعاكستين.

  • في array_merge($a, $b)، تطغى المفاتيح النصية اللاحقة على السابقة ($b تفوز)، بينما لا تُستبدل المفاتيح الرقمية بل تُلحق في النهاية ويُعاد ترقيمها من 0.
  • في معامل الاتحاد $a + $b، تفوز المصفوفة الأولى على اليسار ($a) دائماً في المفاتيح النصية والرقمية معاً، وتُضاف مفاتيح $b غير الموجودة فقط.
  • يعمل معامل التفكيك [...$a, ...$b] بنفس سلوك array_merge($a, $b) تماماً.

ألحقت array_merge() المفتاح الرقمي 0 كعنصر رابع، بينما احتفظ الاتحاد $override + $defaults بقيمة $override[0] وتجاهل $defaults[0].

مخطط توضيحي: محاكي دمج المصفوفات وربط المفاتيح وحساب الفروق في PHP
PHP
<?php
$defaults = ["env" => "prod", "debug" => false, 0 => "read"];
$override = ["debug" => true, 0 => "write"];

$merged = array_merge($defaults, $override);
$union  = $override + $defaults;

echo "Merge debug: " . ($merged["debug"] ? "true" : "false") . ", count: " . count($merged) . "\n";
echo "Union debug: " . ($union["debug"] ? "true" : "false") . ", count: " . count($union) . "\n";

عندما تحتاج أن تطغى المصفوفة اللاحقة على السابقة في المفاتيح النصية والرقمية معاً (مثل معرفات المنتجات أو المستخدمين)، استخدم array_replace() بدلاً من array_merge().

  • تحافظ array_replace($base, $updates) على المفاتيح الرقمية الدقيقة دون إعادة ترقيمها أو تكرار عناصرها.
  • أي مفتاح موجود في $updates يستبدل المفتاح المطابق في $base، وتُضاف المفاتيح الجديدة كما هي.
  • للمصفوفات المتداخلة، تقوم array_replace_recursive() بتحديث القيم الفرعية دون مسح المفاتيح المجاورة.

على عكس array_merge()، قامت array_replace() بتحديث مفتاح المنتج الرقمي 102 في مكانه إلى 64.00 وحافظت على جميع المعرفات الرقمية.

PHP
<?php
$prices  = [101 => 45.00, 102 => 80.00, 103 => 120.00];
$special = [102 => 64.00, 104 => 30.00];

$catalog = array_replace($prices, $special);
foreach ($catalog as $id => $price) {
    echo "#$id: $price | ";
}
echo "\n";

تدمج الدالة array_combine($keys, $values) مصفوفتين متوازيتين بنفس الطول لتكوين مصفوفة ترابطية واحدة (الأولى للمفاتيح والثانية للقيم).

  • تُعد الطريقة القياسية لربط صف رأس أعمدة CSV مع صف البيانات لإنتاج سجل ترابطي واضح.
  • في PHP 8.0+، يؤدي تمرير مصفوفتين مختلفتين في الطول إلى إطلاق خطأ فادح ValueError؛ لذا تحقق دائماً من تساوي العدد أولاً.
  • إذا احتوت مصفوفة المفاتيح $keys على أسماء مكررة، فإن القيمة اللاحقة تطغى على السابقة.

تربط array_combine() كل اسم عمود بالخلية المقابلة له لتنتج المصفوفة الترابطية ["sku" => "KB-90", ...].

PHP
<?php
$headers = ["sku", "title", "stock"];
$csvRow  = ["KB-90", "Mechanical Keyboard", 42];

if (count($headers) === count($csvRow)) {
    $product = array_combine($headers, $csvRow);
    echo $product["sku"] . ": " . $product["title"] . " (" . $product["stock"] . ")\n";
}

تقسّم الدالة array_chunk($array, $length, $preserveKeys) المصفوفة المسطحة إلى مصفوفة ثنائية الأبعاد تتكون من دفعات أصغر لا يتجاوز حجم كل منها $length.

  • استخدم array_chunk() لتقسيم عمليات الإدراج الجماعي في قاعدة البيانات أو لتوزيع البطاقات في صفوف شبكة العرض.
  • قد تحتوي الدفعة الأخيرة على عدد عناصر أقل من $length إذا لم يكن الإجمالي قابلاً للقسمة تماماً.
  • مرر true في المعامل الثالث للحفاظ على المفاتيح الأصلية داخل كل دفعة فرعية.

تم تقسيم العناوين الخمسة إلى 3 دفعات بأحجام (2 ثم 2 ثم 1) لإرسالها على دفعات منظمة.

مخطط تدفق التنفيذ العملي لقسم تقسيم المصفوفات الكبيرة إلى دفعات بـ array_chunk في لغة PHP
PHP
<?php
$emails = ["[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]"];
$batches = array_chunk($emails, 2);

foreach ($batches as $idx => $batch) {
    echo "Batch " . ($idx + 1) . ": " . implode(", ", $batch) . "\n";
}

توفر PHP دوال مقارنة المجموعات لاكتشاف العناصر المفقودة عبر array_diff() أو العناصر المشتركة عبر array_intersect() بين مصفوفتين أو أكثر.

  • ترجع array_diff($a, $b) العناصر الموجودة في $a وغير الموجودة في $b (ترتيب تمرير المصفوفتين مهم جداً!).
  • ترجع array_intersect($a, $b) العناصر المشتركة الموجودة في كلتا المصفوفتين $a و$b.
  • عند مقارنة المصفوفات الترابطية بحيث يُشترط تطابق المفتاح والقيمة معاً، استخدم array_diff_assoc() وarray_intersect_assoc().

تحدد array_diff() الصلاحيات المطلوبة الناقصة لدى المستخدم، بينما تستخرج array_intersect() الصلاحيات المشتركة.

PHP
<?php
$requiredScopes = ["read", "write", "billing", "export"];
$userScopes     = ["read", "export", "profile"];

$missing = array_diff($requiredScopes, $userScopes);
$granted = array_intersect($requiredScopes, $userScopes);

echo "Missing: " . implode(", ", $missing) . "\n";
echo "Granted: " . implode(", ", $granted) . "\n";

تزيل array_unique() القيم المكررة من المصفوفة، بينما تبدّل array_flip() المفاتيح مكان القيم لتحويل البحث الخطي البطيء O(n) إلى فحص فوري بالمفتاح O(1).

  • تحتفظ array_unique($arr) بأول مفتاح لكل قيمة فريدة دون إعادة ترقيم المفاتيح (مرر الناتج إلى array_values() إذا أردت ترقيماً متسلسلاً من 0).
  • تبدّل array_flip($arr) المفاتيح بالقيم، ويشترط أن تكون القيم نصوصاً أو أعداداً صحيحة.
  • يُعد الفحص isset($flipped[$needle]) أسرع بكثير من تكرار استدعاء in_array($needle, $list, true) داخل الحلقات.

تزيل array_unique() الوسوم المكررة، وتعيد array_values() ترقيمها، ثم تبني array_flip() جدول بحث فوري بالمفتاح.

الدالةالوظيفة الأساسيةسلوك المفاتيح
array_merge($a, $b)إلحاق القوائم واستبدال المفاتيح النصيةتُستبدل المفاتيح النصية وتُعاد فهرسة الرقمية
array_replace($a, $b)استبدال القيم بالمفتاح (النصي والرقمي)تحتفظ بجميع المفاتيح كما هي
array_combine($k, $v)ربط مصفوفة مفاتيح بمصفوفة قيمتصبح عناصر $k هي المفاتيح
array_diff($a, $b)إرجاع قيم $a غير الموجودة في $bتحتفظ بمفاتيح المصفوفة الأولى $a
array_unique($a)إزالة القيم المكررةتحتفظ بأول مفتاح لكل قيمة فريدة
PHP
<?php
$rawTags = ["php", "backend", "php", "api", "backend"];
$unique  = array_values(array_unique($rawTags));
$lookup  = array_flip($unique);

echo "Unique: " . implode(", ", $unique) . "\n";
echo "Has api? " . (isset($lookup["api"]) ? "Yes (index " . $lookup["api"] . ")" : "No") . "\n";
خلاصة المعرفة ومحطة الانتقال

ملخص الدرس

حصاد الدرس

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

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

تزيل array_unique() القيم المكررة من المصفوفة، بينما تبدّل array_flip() المفاتيح مكان القيم لتحويل البحث الخطي البطيء O(n) إلى فحص فوري بالمفتاح O(1). تحتفظ array_unique($arr) بأول مفتاح لكل قيمة فريدة دون إعادة ترقيم المفاتيح (مرر الناتج إلى array_values() إذا أردت ترقيماً متسلسلاً من 0). تبدّل array_flip($arr) المفاتيح بالقيم، ويشترط أن تكون القيم نصوصاً أو أعداداً صحيحة. يُعد الفحص isset($flipped[$needle]) أسرع بكثير من تكرار استدعاء in_array($needle, $list, true) داخل الحلقات.

مشاركة

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

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

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

المصطلحات4

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

0 / 4 مفهومةأول بطاقة، أول خطوة
01 Merge, Combine & Diff دمج ومقارنة المصفوفات
ادمج واستبدل عناصر المصفوفات بـ array_merge وarray_replace، واربط المفاتيح بالقيم عبر array_combine، واحسب التقاطع والاختلاف.
للمراجعة
02 array_merge vs Plus Union Operator الفرق الدقيق بين دالة array_merge ومعامل الاتحاد +
المفهوم الأساسي لقسم الفرق الدقيق بين دالة array_merge ومعامل الاتحاد + في لغة PHP الحديثة.
للمراجعة
03 Overwriting Values with array_replace استبدال القيم مع الحفاظ على المفاتيح بـ array_replace
الصياغة البرمجية والتطبيق العملي المباشر لقسم استبدال القيم مع الحفاظ على المفاتيح بـ array_replace.
للمراجعة
04 Pairing Keys and Values with array_combine بناء مصفوفة ترابطية من مصفوفتين بـ 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_merge ومعامل الاتحاد + للتحقق من المخرجات.

  2. بدّل بين الحالات الثلاث في المحاكي التفاعلي ضمن قسم استبدال القيم مع الحفاظ على المفاتيح بـ array_replace وقارن مخرجات التنفيذ.

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

مساحة التحدي

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

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

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

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

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

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

كيف تتعامل الدالة array_merge($a, $b) مع المفاتيح الرقمية المكررة مقابل المفاتيح النصية المكررة؟

تستبدل array_merge() المفاتيح النصية المتطابقة ولكنها تلحق المفاتيح الرقمية وتعيد ترقيمها.

02

أي دالة تستبدل المفاتيح الرقمية المتطابقة في مكانها دون إعادة ترقيمها من الصفر؟

تحافظ array_replace() على المفاتيح الرقمية وتحدث قيمها عند التطابق.

03

ماذا يحدث في PHP 8+ عند استدعاء array_combine($keys, $values) بمصفوفتين مختلفتين في عدد العناصر؟

منذ PHP 8.0 تطلق array_combine() خطأ ValueError إذا اختلف طول المصفوفتين.

04

ما الناتج الذي ترجعه الدالة array_diff(["a", "b", "c"], ["b", "d"])؟

ترجع array_diff() عناصر المصفوفة الأولى غير الموجودة في الثانية مع الحفاظ على مفاتيحها.

05

لماذا يغلّف المطورون غالباً ناتج array_unique($tags) داخل الدالة array_values()؟

تعيد array_values() ترقيم المصفوفة بشكل متسلسل نظيف من 0.

06

أي دالة تبدّل مفاتيح المصفوفة مكان قيمها لإتاحة البحث السريع عبر isset()؟

تحول array_flip() القيم إلى مفاتيح والمفاتيح إلى قيم للبحث الفوري O(1).

07

ما الناتج الذي ترجعه الدالة array_chunk(["A", "B", "C", "D", "E"], 2)؟

تقسم array_chunk() العناصر الخمسة إلى مصفوفات فرعية بحد أقصى عنصرين لكل دفعة.

08

أي دالة ترجع العناصر الموجودة في $a والتي توجد قيمها أيضاً في $b؟

تحسب array_intersect() التقاطع أي القيم المشتركة بين المصفوفات.