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

عمليات المكدس والطابور واقتطاع وتعديل المصفوفات بـ slice و splice في PHPPHP Array Stack Queue Operations Slicing and Splicing

تحكم في أطراف المصفوفة عبر array_push وarray_pop وarray_shift وarray_unshift، واقتطع أو استبدل الشرائح بـ array_slice وarray_splice.
أقسام الدرس
6
الأمثلة
6
اللغة
العربية
تاريخ النشر
غير محدد
المشاهدات
0
محتوى الدرس
في هذا الدرس 6تصفّح المواضيع

يعمل المكدس بنمط (آخر ما يدخل هو أول ما يخرج LIFO) على نهاية المصفوفة باستخدام $arr[] ودالتي array_push() وarray_pop().

  • استخدم صيغة الإلحاق المباشر $stack[] = $val عند إضافة عنصر واحد لتجنب تكلفة استدعاء الدالة.
  • استخدم array_push($stack, $v1, $v2) لإضافة عدة عناصر دفعة واحدة؛ وترجع الدالة العدد الجديد للعناصر.
  • تحذف array_pop($stack) العنصر الأخير وترجعه، أو ترجع null إذا كانت المصفوفة فارغة.

تُضاف العناصر إلى نهاية $history، ثم تسحب array_pop() آخر عنصر أُضيف ("confirm") وترجعه بزمن ثابت O(1).

مخطط توضيحي: محاكي عمليات المكدس والطابور والاقتطاع (slice / splice) في PHP
PHP
<?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
<?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
<?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.

مخطط تدفق التنفيذ العملي لقسم اقتطاع شريحة دون تعديل الأصل عبر array_slice في لغة PHP
PHP
<?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
<?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
<?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

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

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

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

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 محلياً ونفّذ المثال البرمجي المشروح في قسم إضافة وسحب عناصر نهاية المصفوفة بـ push و pop للتحقق من المخرجات.

  2. بدّل بين الحالات الثلاث في المحاكي التفاعلي ضمن قسم إضافة وسحب عناصر بداية المصفوفة بـ unshift و shift وقارن مخرجات التنفيذ.

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

مساحة التحدي

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

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

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

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

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

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

أي دالة تحذف وترجع أول عنصر في بداية المصفوفة مع إعادة ترقيم المفاتيح الرقمية من الصفر؟

تسحب array_shift() العنصر الأول وتعيد ترقيم المفاتيح الرقمية من 0.

02

ماذا تسند التعليمة $out = array_slice(["a", "b", "c", "d"], -2); للمتغير $out؟

الإزاحة السالبة (-2) تبدأ العد قبل نهاية المصفوفة بعنصرين.

03

كيف تحافظ على المفاتيح الرقمية الأصلية عند اقتطاع جزء من المصفوفة بدالة array_slice()؟

تمرير true كمعامل رابع يحافظ على المفاتيح الرقمية دون تصفير.

04

كيف يمكنك إدراج العنصر "NEW" عند الفهرس 2 داخل $items باستخدام array_splice() دون حذف أي عنصر حالي؟

ضبط الطول على 0 يمنع حذف أي عنصر ويدرج البديل عند الفهرس 2.

05

ما القيمة التي ترجعها الدالة array_splice($arr, 1, 2)؟

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

06

كيف تحذف أول عنصر من $users = [501 => "Ali", 502 => "Sara"] دون فقدان المفتاح الرقمي 502؟

تحذف unset() المفتاح المحدد دون إعادة ترقيم المفاتيح الرقمية المتبقية.

07

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

تتجنب صيغة القوسين الفارغين تكلفة استدعاء دالة.

08

ماذا ترجع الدالة array_pop($emptyArray) عند استدعائها على مصفوفة فارغة []؟

ترجع كل من array_pop() وarray_shift() القيمة null إذا كانت المصفوفة فارغة.