في هذا الدرس 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
$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
$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
$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) لإرسالها على دفعات منظمة.
<?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
$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
$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
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 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
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 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 ويرسلها إلى متصفح العميل بعد التنفيذ.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
مهامك قبل الاختبار
خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.
-
أنشئ ملف PHP محلياً ونفّذ المثال البرمجي المشروح في قسم الفرق الدقيق بين دالة array_merge ومعامل الاتحاد + للتحقق من المخرجات.
-
بدّل بين الحالات الثلاث في المحاكي التفاعلي ضمن قسم استبدال القيم مع الحفاظ على المفاتيح بـ array_replace وقارن مخرجات التنفيذ.
تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.
اختبر فهمك.
ووصلها للإتقان.
كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.
أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.
الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.
لمحة عن التحدي8 أسئلة تنتظرك +
كيف تتعامل الدالة array_merge($a, $b) مع المفاتيح الرقمية المكررة مقابل المفاتيح النصية المكررة؟
تستبدل array_merge() المفاتيح النصية المتطابقة ولكنها تلحق المفاتيح الرقمية وتعيد ترقيمها.
أي دالة تستبدل المفاتيح الرقمية المتطابقة في مكانها دون إعادة ترقيمها من الصفر؟
تحافظ array_replace() على المفاتيح الرقمية وتحدث قيمها عند التطابق.
ماذا يحدث في PHP 8+ عند استدعاء array_combine($keys, $values) بمصفوفتين مختلفتين في عدد العناصر؟
منذ PHP 8.0 تطلق array_combine() خطأ ValueError إذا اختلف طول المصفوفتين.
ما الناتج الذي ترجعه الدالة array_diff(["a", "b", "c"], ["b", "d"])؟
ترجع array_diff() عناصر المصفوفة الأولى غير الموجودة في الثانية مع الحفاظ على مفاتيحها.
لماذا يغلّف المطورون غالباً ناتج array_unique($tags) داخل الدالة array_values()؟
تعيد array_values() ترقيم المصفوفة بشكل متسلسل نظيف من 0.
أي دالة تبدّل مفاتيح المصفوفة مكان قيمها لإتاحة البحث السريع عبر isset()؟
تحول array_flip() القيم إلى مفاتيح والمفاتيح إلى قيم للبحث الفوري O(1).
ما الناتج الذي ترجعه الدالة array_chunk(["A", "B", "C", "D", "E"], 2)؟
تقسم array_chunk() العناصر الخمسة إلى مصفوفات فرعية بحد أقصى عنصرين لكل دفعة.
أي دالة ترجع العناصر الموجودة في $a والتي توجد قيمها أيضاً في $b؟
تحسب array_intersect() التقاطع أي القيم المشتركة بين المصفوفات.