لحذف عنصر من مصفوفة PHP بمفتاحه، استخدم unset($array[$key]). يختفي العنصر، وتبقى المفاتيح الأخرى كما كانت تمامًا، وحذف مفتاح غير موجود ليس خطأً.
انظر إلى النتيجة الثانية: المفاتيح الآن 0, 2, 3. لا تعيد unset الترقيم أبدًا.
إعادة فهرسة المصفوفة بعد unset
القائمة التي فيها فجوة في مفاتيحها تسبب مشكلات لاحقًا: تصطدم حلقة for ($i = 0; ...) بالفهرس المفقود، وتكتب json_encode كائن JSON بدل مصفوفة. تعطيك array_values() مفاتيح نظيفة من جديد.
الحذف بالموضع بـ array_splice
تحذف array_splice($array, $offset, $length) عدد $length من العناصر بدءًا من الموضع $offset، وتعيد ترقيم المفاتيح، وتعيد ما حذفته. والإزاحة السالبة تُعدّ من النهاية. وتستطيع أيضًا إدراج عناصر بديلة في الاستدعاء نفسه.
تعمل array_splice على المواضع، لا المفاتيح: على مصفوفة ترابطية تحذف حسب المكان في الترتيب، وتحتفظ بالمفاتيح النصية. وتقارنها صفحة array_slice بـ array_slice، التي تنسخ جزءًا دون تغيير الأصل.
حذف عنصر بقيمته
تعيد array_diff($array, [$value]) المصفوفة دون كل عنصر يساوي $value، محتفظة بمفاتيح البقية. ولحذف أول تطابق فقط، جد مفتاحه بـ array_search واحذفه بـ unset.
تقارن array_diff القيم على أنها نصوص، لذا تحذف array_diff([1, "1", 2], [1]) العدد الصحيح والنص كليهما. وعندما يكون الشرط أكثر من «يساوي هذه القيمة»، استخدم array_filter مع دالة استدعاء.
حذف العنصر الأول أو الأخير
تحذف array_shift() العنصر الأول وتحذف array_pop() العنصر الأخير. وكلتاهما تعيد العنصر الذي حذفته، وهذا يجعلهما مفيدتين للطوابير والمكدسات.
تعيد array_shift ترقيم المفاتيح الرقمية من 0. ولا تحتاج array_pop إلى ذلك، لأن الفجوة في النهاية.
حذف عدة مفاتيح معًا
تقبل unset عدة عناصر في استدعاء واحد. ولحذف قائمة من المفاتيح لديك في مصفوفة، اقلبها بـ array_flip() لتصبح الأسماء مفاتيح، ثم مرّرها إلى array_diff_key().
خطأ شائع: unset مع array_search عندما تكون القيمة مفقودة
تعيد array_search القيمة false عندما لا تجد شيئًا، وfalse المستخدمة مفتاحًا في مصفوفة تصبح 0. لذا يحذف هذا السطر العنصر الأول كلما لم تكن القيمة في المصفوفة:
خزّن دائمًا نتيجة array_search وقارنها بـ !== false قبل استخدامها مفتاحًا. ولا تكفي if ($key) البسيطة أيضًا: التطابق عند الفهرس 0 خاطئ منطقيًا كذلك.
الأسئلة الشائعة
كيف أحذف عنصرًا من مصفوفة بقيمته في PHP؟
لحذف كل مرات الظهور، استخدم array_diff($arr, ['value']). ولحذف الأولى فقط، جد مفتاحها واحذفه بـ unset، متحققًا من أنها وُجدت: $k = array_search('value', $arr); if ($k !== false) { unset($arr[$k]); }.
كيف أعيد فهرسة مصفوفة بعد unset؟
ضعها داخل array_values(): تعيد $arr = array_values($arr); ترقيم المفاتيح من 0. أو احذف العنصر بـ array_splice($arr, $index, 1)، التي تعيد الترقيم نيابة عنك.
كيف أحذف العنصر الأول أو الأخير من مصفوفة؟
تحذف array_shift($arr) العنصر الأول وتعيده وتعيد ترقيم المفاتيح الرقمية. وتحذف array_pop($arr) العنصر الأخير وتعيده.
هل أستطيع حذف عنصر بـ unset داخل حلقة foreach؟
نعم. foreach ($arr as $k => $v) { if ($v < 0) { unset($arr[$k]); } } آمنة، لأن foreach تمر على نسخة من المصفوفة بينما تغيّر أنت الأصل. تبقى الفجوات في المفاتيح، فاستدعِ array_values() بعدها إذا احتجت إلى قائمة.
هل يسبب unset على مفتاح مفقود خطأً؟
لا. لا تفعل unset($arr['missing']) شيئًا ولا تطلق أي تحذير، لذا لا تحتاج إلى الفحص بـ isset أولًا.