في هذا الدرس 6تصفّح المواضيع
يعمل المكدس بنمط (آخر ما يدخل هو أول ما يخرج LIFO) على نهاية المصفوفة باستخدام $arr[] ودالتي array_push() وarray_pop().
- استخدم صيغة الإلحاق المباشر
$stack[] = $valعند إضافة عنصر واحد لتجنب تكلفة استدعاء الدالة. - استخدم
array_push($stack, $v1, $v2)لإضافة عدة عناصر دفعة واحدة؛ وترجع الدالة العدد الجديد للعناصر. - تحذف
array_pop($stack)العنصر الأخير وترجعه، أو ترجعnullإذا كانت المصفوفة فارغة.
تُضاف العناصر إلى نهاية $history، ثم تسحب array_pop() آخر عنصر أُضيف ("confirm") وترجعه بزمن ثابت O(1).
<?php
$history = ["home", "catalog"];
$history[] = "cart";
array_push($history, "checkout", "confirm");
$lastVisited = array_pop($history);
echo "Popped: $lastVisited\n";
echo "Remaining (" . count($history) . "): " . implode(" -> ", $history) . "\n";
يعالج الطابور بنمط (أول ما يدخل هو أول ما يخرج FIFO) العناصر حسب ترتيب وصولها عبر الإضافة أو السحب من بداية المصفوفة بدالتي array_unshift() وarray_shift().
- تُدرج
array_unshift($queue, $item1, $item2)عنصراً أو أكثر في بداية المصفوفة بنفس الترتيب الممرر. - تسحب
array_shift($queue)أول عنصر في بداية المصفوفة وتحذفه وترجع قيمته. - إن الجمع بين الإلحاق في النهاية
$queue[] = $jobوالسحب من البدايةarray_shift($queue)يكوّن طابوراً قياسياً FIFO.
تضع array_unshift() المهمة "verify-payment" في مقدمة الطابور، ثم تسحبها array_shift() لتنفيذها أولاً.
<?php
$jobs = ["send-receipt", "sync-stock"];
array_unshift($jobs, "verify-payment");
$jobs[] = "archive-order";
$currentJob = array_shift($jobs);
echo "Processing: $currentJob\n";
echo "Next in queue: " . implode(", ", $jobs) . "\n";
على عكس unset()، تقوم كل من array_shift() وarray_unshift() بإعادة ترقيم جميع المفاتيح الرقمية تلقائياً لتبدأ من 0 مع إبقاء المفاتيح النصية كما هي.
- إذا كانت المصفوفة تستخدم معرفات رقمية كمفاتيح (مثل
[104 => "Laptop", 209 => "Mouse"])، فإن استدعاءarray_shift()يمسح تلك المعرفات ويعيد ترقيم الباقي إلى0, 1, .... - تتطلب إعادة الترقيم تحديث جميع العناصر بزمن O(n)، مما يجعل تكرار
array_shift()بطيئاً مع المصفوفات الضخمة. - لحذف العنصر الأول دون المساس بالمفاتيح الرقمية، استخرج المفتاح الأول بـ
array_key_first($arr)ثم احذفه بـunset().
أعادت array_shift() ترقيم المفتاح الرقمي 208 ليصبح 0 وأبقت المفتاح النصي "vip"، بينما حافظت unset() مع array_key_first() على المفتاح 208.
<?php
$tickets = [104 => "Login Bug", 208 => "CSS Glitch", "vip" => "Outage"];
array_shift($tickets);
print_r($tickets);
$safe = [104 => "Login Bug", 208 => "CSS Glitch"];
unset($safe[array_key_first($safe)]);
echo "Preserved key: " . array_key_first($safe) . "\n";
تقتطع الدالة array_slice($array, $offset, $length, $preserveKeys) نافذة متجاورة من العناصر في مصفوفة جديدة دون أي تعديل على المصفوفة الأصلية.
- يبدأ المعامل الموجب
$offsetالعد من البداية (من الصفر)، بينما يبدأ السالب من النهاية (مثل-2للبدء من آخر عنصرين). - يُوقف الطول السالب
$lengthالاقتطاع قبل نهاية المصفوفة بعدد العناصر المحدد. - مرر
trueكمعامل رابع ($preserveKeys) لمنع PHP من تصفير المفاتيح الرقمية في الشريحة المستخرجة.
افتراضياً تعيد array_slice() ترقيم المفاتيح الرقمية إلى 0, 1، بينما تمرير true في المعامل الرابع يحافظ على المفاتيح الأصلية 20, 30.
<?php
$scores = [10 => 88, 20 => 92, 30 => 95, 40 => 99];
$page = array_slice($scores, 1, 2);
$kept = array_slice($scores, 1, 2, true);
$lastTwo = array_slice($scores, -2);
echo "Reset keys: " . implode(",", array_keys($page)) . "\n";
echo "Kept keys : " . implode(",", array_keys($kept)) . "\n";
تعدّل الدالة array_splice(&$array, $offset, $length, $replacement) المصفوفة الأصلية مباشرة بالمرجع؛ فتحذف أو تستبدل أو تدرج عناصر في أي موضع وترجع مصفوفة بالعناصر المحذوفة.
- لحذف عناصر مع إعادة ترقيم المصفوفة دون ترك فجوات، استدعِ
array_splice($arr, $offset, $count). - لإدراج عناصر جديدة في الوسط دون حذف أي عنصر، مرر
0للطول:array_splice($arr, $offset, 0, $newItems). - على عكس
array_slice()، فإن القيمة المرجعة منarray_splice()هي العناصر المحذوفة، بينما تتحدث$arrayنفسها في مكانها.
بدءاً من الفهرس 2، تحذف array_splice() عنصراً واحداً ("Old Ad") وتحقن عنصرين بديلين مباشرة داخل $playlist.
<?php
$playlist = ["Intro", "Track 1", "Old Ad", "Track 2"];
$removed = array_splice($playlist, 2, 1, ["Sponsor Spot", "Interlude"]);
echo "Removed : " . implode(", ", $removed) . "\n";
echo "Updated : " . implode(" | ", $playlist) . "\n";
يُعد الخلط بين array_slice() وarray_splice() خطأً شائعاً؛ فالأولى تقرأ نسخة آمنة بينما الثانية تغيّر المصفوفة الأصلية بشكل دائم.
- استخدم
array_slice()لمعاينة صفحات النتائج (Pagination) أو استخراج أعلى العناصر دون المساس بالأصل. - استخدم
array_splice()عندما تريد عمداً حذف أو استبدال أو إدراج عناصر داخل متغير المصفوفة نفسه. - تذكر أن
array_splice()لا تحتفظ بالمفاتيح الرقمية أبداً، بل تعيد ترقيمها دائماً من0.
تركت array_slice() المصفوفة $source سليمة بأربعة عناصر، بينما اقتطعت array_splice() أول عنصرين من داخل $source.
| الميزة | array_slice() | array_splice() | array_shift() / array_pop() |
|---|---|---|---|
| هل تعدّل المصفوفة الأصلية؟ | لا (قراءة آمنة فقط) | نعم (تعديل مباشر بالمرجع) | نعم (تعديل مباشر بالمرجع) |
| القيمة المُرجعة | الشريحة المستخرجة | مصفوفة بالعناصر المحذوفة | العنصر الواحد المسحوب |
| هل تحتفظ بالمفاتيح الرقمية؟ | نعم (بتمرير true في المعامل الرابع) | لا (تعيد الترقيم دائماً من 0) | pop: نعم / shift: لا |
| هل تتيح إدراج عناصر بديلة؟ | لا | نعم (عبر المعامل الرابع) | استخدم push / unshift |
<?php
$source = ["v1", "v2", "v3", "v4"];
$preview = array_slice($source, 0, 2);
$deleted = array_splice($source, 0, 2);
echo "Preview : " . implode(", ", $preview) . "\n";
echo "Source left after splice: " . implode(", ", $source) . "\n";
ملخص الدرس
حصاد الدرسمراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي
ماذا تعلّمت في هذا الدرس؟
يُعد الخلط بين array_slice() وarray_splice() خطأً شائعاً؛ فالأولى تقرأ نسخة آمنة بينما الثانية تغيّر المصفوفة الأصلية بشكل دائم. استخدم array_slice() لمعاينة صفحات النتائج (Pagination) أو استخراج أعلى العناصر دون المساس بالأصل. استخدم array_splice() عندما تريد عمداً حذف أو استبدال أو إدراج عناصر داخل متغير المصفوفة نفسه. تذكر أن array_splice() لا تحتفظ بالمفاتيح الرقمية أبداً، بل تعيد ترقيمها دائماً من 0.
سجّل الدخول لحفظ تقدمك
تابع إنجاز المواضيع والمصطلحات والمهام، وكمّل من آخر خطوة على أي جهاز.
المصطلحات4
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 01 Push, Pop & Splice الإضافة والحذف و slice
- تحكم في أطراف المصفوفة عبر array_push وarray_pop وarray_shift وarray_unshift، واقتطع أو استبدل الشرائح بـ array_slice وarray_splice.
- للمراجعة
- 02 Appending and Popping Stack Items إضافة وسحب عناصر نهاية المصفوفة بـ push و pop
- المفهوم الأساسي لقسم إضافة وسحب عناصر نهاية المصفوفة بـ push و pop في لغة PHP الحديثة.
- للمراجعة
- 03 Shifting and Prepending Queue Items إضافة وسحب عناصر بداية المصفوفة بـ unshift و shift
- الصياغة البرمجية والتطبيق العملي المباشر لقسم إضافة وسحب عناصر بداية المصفوفة بـ unshift و shift.
- للمراجعة
- 04 Reindexing Caveat of array_shift أثر إعادة ترقيم المفاتيح الرقمية عند استخدام array_shift
- قواعد التحقق وأفضل الممارسات القياسية الخاصة بقسم أثر إعادة ترقيم المفاتيح الرقمية عند استخدام array_shift.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
الاختصارات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 محلياً ونفّذ المثال البرمجي المشروح في قسم إضافة وسحب عناصر نهاية المصفوفة بـ push و pop للتحقق من المخرجات.
-
بدّل بين الحالات الثلاث في المحاكي التفاعلي ضمن قسم إضافة وسحب عناصر بداية المصفوفة بـ unshift و shift وقارن مخرجات التنفيذ.
تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.
اختبر فهمك.
ووصلها للإتقان.
كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.
أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.
الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.
لمحة عن التحدي8 أسئلة تنتظرك +
أي دالة تحذف وترجع أول عنصر في بداية المصفوفة مع إعادة ترقيم المفاتيح الرقمية من الصفر؟
تسحب array_shift() العنصر الأول وتعيد ترقيم المفاتيح الرقمية من 0.
ماذا تسند التعليمة $out = array_slice(["a", "b", "c", "d"], -2); للمتغير $out؟
الإزاحة السالبة (-2) تبدأ العد قبل نهاية المصفوفة بعنصرين.
كيف تحافظ على المفاتيح الرقمية الأصلية عند اقتطاع جزء من المصفوفة بدالة array_slice()؟
تمرير true كمعامل رابع يحافظ على المفاتيح الرقمية دون تصفير.
كيف يمكنك إدراج العنصر "NEW" عند الفهرس 2 داخل $items باستخدام array_splice() دون حذف أي عنصر حالي؟
ضبط الطول على 0 يمنع حذف أي عنصر ويدرج البديل عند الفهرس 2.
ما القيمة التي ترجعها الدالة array_splice($arr, 1, 2)؟
تعدل array_splice() المصفوفة $arr في مكانها وترجع مصفوفة بالعناصر التي تم اقتطاعها.
كيف تحذف أول عنصر من $users = [501 => "Ali", 502 => "Sara"] دون فقدان المفتاح الرقمي 502؟
تحذف unset() المفتاح المحدد دون إعادة ترقيم المفاتيح الرقمية المتبقية.
أي صيغة هي الأسرع لإلحاق عنصر واحد فقط في نهاية المصفوفة؟
تتجنب صيغة القوسين الفارغين تكلفة استدعاء دالة.
ماذا ترجع الدالة array_pop($emptyArray) عند استدعائها على مصفوفة فارغة []؟
ترجع كل من array_pop() وarray_shift() القيمة null إذا كانت المصفوفة فارغة.