تعيد array_filter($array, $callback) عناصر $array التي تعيد لها $callback القيمة true (أو أي قيمة تتحول إلى true). المصفوفة أولًا، ودالة الاستدعاء ثانيًا، والعناصر التي تبقى تحتفظ بمفاتيحها الأصلية.
المفاتيح في النتيجة هي 1, 3, 5, 7: المواضع التي كانت لتلك القيم في المصفوفة الأصلية. لهذا التفصيل أهمية أكبر مما يبدو، ويبيّن القسم بعد التالي كيف تتعامل معه.
حذف القيم الفارغة من مصفوفة
استدعِ array_filter دون دالة استدعاء فتحذف كل قيمة تتحول إلى false: النصوص الفارغة وnull وfalse و0 و"0" والمصفوفات الفارغة. هذه أسرع طريقة لتنظيف أجزاء ناتج explode() أو قائمة من حقول نموذج.
خسرت النتيجة الأولى أيضًا "0" و0، وهما كثيرًا ما يكونان بيانات حقيقية (كمية صفر، رقم في رمز بريدي). وعندما يكون الصفر إجابة صحيحة، اكتب دالة الاستدعاء بنفسك، كما في الاستدعاء الثاني. في صفحة empty القائمة الكاملة للقيم التي تعدّها PHP فارغة.
إعادة فهرسة النتيجة بـ array_values
لأن المفاتيح تُحفظ، قد تكون في القائمة المصفّاة فجوات. عندها تصطدم حلقة for تبدأ من 0 بمفاتيح مفقودة، وتحوّل json_encode النتيجة إلى كائن JSON بدل مصفوفة. تعيد array_values() ترقيمها.
التصفية بالمفتاح بـ ARRAY_FILTER_USE_KEY
يحدد الوسيط الثالث ما تتلقاه دالة الاستدعاء. تمرر ARRAY_FILTER_USE_KEY المفتاح فقط. وتمرر ARRAY_FILTER_USE_BOTH القيمة ثم المفتاح.
للإبقاء على مجموعة ثابتة من المفاتيح تعرفها مسبقًا، تفعل array_intersect_key($config, array_flip(['db_host', 'db_port'])) الشيء نفسه دون دالة استدعاء.
تصفية مصفوفة متعددة الأبعاد
معظم البيانات الحقيقية قائمة من الصفوف. تتلقى دالة الاستدعاء صفًا واحدًا في كل مرة، فتختبر الحقل الذي تحتاجه.
غيّر $maxPrice وشغّله مرة أخرى. وللحصول على الأسماء فقط بعد ذلك، مرّر النتيجة إلى array_column: array_column($affordable, 'name').
صفِّ، ثم حوّل، ثم اختزل
تختار array_filter العناصر، وتغيّرها array_map، وتطوي array_reduce المصفوفة إلى قيمة واحدة. تستدعي array_reduce($array, $callback, $initial) دالة الاستدعاء بالمجموع الجاري والعنصر التالي.
للجمع البسيط، array_sum($totals) أقصر. وتستحق array_reduce مكانها عندما تكون النتيجة شيئًا آخر: نصًا، أو عددًا لكل مجموعة، أو الصف الأكبر.
خطأ شائع: تغيير القيم داخل array_filter
القيمة التي تعيدها دالة الاستدعاء لا تقرر إلا بقاء العنصر. وكل ما تحسبه غير ذلك يُرمى، لذا فهذه الشيفرة لا تشذّب أي شيء:
حوّل بـ array_map، ثم صفِّ، وأضف array_values عندما تحتاج إلى قائمة نظيفة.
الأسئلة الشائعة
كيف أحذف القيم الفارغة من مصفوفة في PHP؟
استدعِ array_filter($array) دون دالة استدعاء: تُسقط كل قيمة خاطئة منطقيًا ("" وnull وfalse و0 و"0" و[]). ولإسقاط النصوص الفارغة وnull فقط مع الإبقاء على 0، مرّر دالة استدعاء: array_filter($array, fn($v) => $v !== '' && $v !== null).
لماذا تحتفظ array_filter بالمفاتيح القديمة؟
لا تعيد array_filter الترقيم أبدًا: تبقى العناصر التي تحتفظ بها تحت مفاتيحها الأصلية، لذا قد تعود القائمة على شكل [0 => 'a', 2 => 'c']. ضعها داخل array_values() لتحصل على 0, 1, 2 مجددًا، وهذا يجعل json_encode تنتج مصفوفة JSON بدل كائن.
كيف أصفّي مصفوفة بالمفتاح في PHP؟
مرّر ARRAY_FILTER_USE_KEY وسيطًا ثالثًا، فتتلقى دالة الاستدعاء المفتاح بدل القيمة: array_filter($arr, fn($k) => str_starts_with($k, 'db_'), ARRAY_FILTER_USE_KEY). واستخدم ARRAY_FILTER_USE_BOTH لتتلقى القيمة والمفتاح.
ما الفرق بين array_filter وarray_map؟
تقرر array_filter أي العناصر تبقى وتعيدها دون تغيير. وتغيّر array_map كل عنصر وتعيد العدد نفسه من العناصر. وللقيام بالأمرين، اربطهما: array_map('strtoupper', array_filter($arr)).