تعيد array_unique($array) المصفوفة بعد حذف القيم المكررة. يبقى أول ظهور لكل قيمة، تحت مفتاحه الأصلي، وتُسقط النسخ اللاحقة.
تحتفظ النتيجة الأولى بالمفاتيح 0, 1, 3: المواضع التي ظهرت فيها كل قيمة أول مرة. ضع الاستدعاء داخل array_values() عندما تريد قائمة نظيفة، مثلًا قبل json_encode.
كيف تقرر array_unique أن قيمتين متماثلتان
افتراضيًا تُحوَّل كل قيمة إلى نص وتُقارن النصوص. لذا تُعدّ 1 و"1" و1.0 القيمة نفسها، ويفوز أولها. ويغيّر الوسيط الثاني طريقة المقارنة.
| العلم | تكون القيمتان مكررتين عندما |
|---|---|
SORT_STRING (الافتراضي) | (string) $a === (string) $b |
SORT_REGULAR | $a == $b |
SORT_NUMERIC | تتساويان عددين |
مع الافتراضي، تبقى "01" لأن النص "01" ليس النص "1". ومع SORT_REGULAR تُسقط، لأن "01" == 1 صحيحة. وتسمح المقارنة المرنة أيضًا للقيمة المنطقية true بأن تطابق أي قيمة غير فارغة. افحص المخرجات قبل الاعتماد عليها مع أنواع مختلطة؛ تشرح صفحة عوامل المقارنة القواعد.
حذف التكرارات متجاهلًا حالة الأحرف
array_unique حساسة لحالة الأحرف: "PHP" و"php" مختلفتان. لمعاملتهما مكررتين مع الإبقاء على الكتابة الأصلية لأولاهما، جد المفاتيح الفريدة على نسخة بأحرف صغيرة واحتفظ بتلك المفاتيح من الأصل.
تبني array_map نسخة بأحرف صغيرة بالمفاتيح نفسها، وتُبقي array_unique مفاتيح الظهور الأول، وتلتقط array_intersect_key تلك المفاتيح من المصفوفة الأصلية. وللنصوص ذات العلامات أو اليابانية، استخدم mb_strtolower بدل strtolower.
array_unique على مصفوفة متعددة الأبعاد
دون علم، تحوّل array_unique كل صف إلى النص "Array"، فتبدو كل الصفوف متطابقة ولا يبقى إلا الأول، مع تحذير "Array to string conversion" لكل صف. مرّر SORT_REGULAR لمقارنة الصفوف كاملة. وللإبقاء على صف واحد لكل قيمة من حقل واحد، تكون array_column مع null ومفتاح فهرس أبسط.
يُبقي الأسلوب الثاني آخر صف لكل بريد لأن كل صف لاحق يستبدل السابق تحت المفتاح نفسه. وتشرح صفحة array_column مفتاح الفهرس بالتفصيل.
إيجاد القيم المكررة وعدّها
تعيد array_count_values() عدد مرات ظهور كل قيمة. صفِّ ذلك للأعداد الأكبر من واحد فتحصل على التكرارات.
الفحص الأخير سطر شائع لاختبار ما إذا كان في المصفوفة أي تكرار أصلًا.
قيم فريدة أسرع للمصفوفات الكبيرة
تحوّل array_unique كل قيمة إلى نص قبل المقارنة، وهذا مقبول لآلاف القيم. أما لقائمة كبيرة من الأعداد الصحيحة أو النصوص، فقلب المصفوفة أسرع: تصبح القيم مفاتيح، والمفاتيح فريدة بطبيعتها.
تتغير الأزمنة من تشغيل لآخر، لكن نسخة القلب عادة أسرع بعدة مرات. ولا تعمل إلا مع القيم التي يمكن أن تكون مفاتيح مصفوفة (الأعداد الصحيحة والنصوص)، وتعود النصوص الرقمية مثل "5" أعدادًا صحيحة.
الأسئلة الشائعة
هل تحتفظ array_unique بالمفاتيح؟
نعم. تُبقي أول ظهور لكل قيمة تحت مفتاحه الأصلي وتُسقط المرات اللاحقة، لذا قد تكون في المفاتيح فجوات. استخدم array_values(array_unique($arr)) لإعادة ترقيمها من 0.
كيف أستخدم array_unique على مصفوفة متعددة الأبعاد؟
مرّر SORT_REGULAR لتُقارن الصفوف كاملة: array_unique($rows, SORT_REGULAR). وللإبقاء على صف واحد لكل قيمة من حقل، مثل صف واحد لكل بريد إلكتروني، فهرِس الصفوف بذلك الحقل: تُبقي array_column($rows, null, 'email') آخر صف لكل بريد.
كيف أحذف التكرارات متجاهلًا الأحرف الكبيرة والصغيرة؟
جد المفاتيح الفريدة على نسخة بأحرف صغيرة واحتفظ بتلك المفاتيح من الأصل: array_intersect_key($arr, array_unique(array_map('strtolower', $arr))). استخدم mb_strtolower للنصوص خارج ASCII.
كيف أجد القيم المكررة في مصفوفة PHP؟
عُدّها بـ array_count_values($arr)، ثم احتفظ بالأعداد الأكبر من واحد: array_keys(array_filter(array_count_values($arr), fn($n) => $n > 1)). لا تعمل array_count_values إلا مع النصوص والأعداد الصحيحة.