كيف يمكنني استخدام array_unique على مجموعة من المصفوفات؟

StackOverflow https://stackoverflow.com/questions/2561248

  •  23-09-2019
  •  | 
  •  

سؤال

لدي صفيف

Array(
[0] => Array
    (
        [0] => 33
        [user_id] => 33
        [1] => 3
        [frame_id] => 3
    )

[1] => Array
    (
        [0] => 33
        [user_id] => 33
        [1] => 3
        [frame_id] => 3
    )

[2] => Array
    (
        [0] => 33
        [user_id] => 33
        [1] => 8
        [frame_id] => 8
    )

[3] => Array
    (
        [0] => 33
        [user_id] => 33
        [1] => 3
        [frame_id] => 3
    )

[4] => Array
    (
        [0] => 33
        [user_id] => 33
        [1] => 3
        [frame_id] => 3
    )

)

كما ترون أن المفتاح 0 هو نفسه مثل 1 و 3 و 4. والمفتاح 2 يختلف عنهم جميعًا.

عند تشغيل وظيفة array_unique عليها ، اليسار الوحيد هو

Array (
[0] => Array
    (
        [0] => 33
        [user_id] => 33
        [1] => 3
        [frame_id] => 3
    )
)

أي أفكار لماذا لا تعمل array_unique كما هو متوقع؟

هل كانت مفيدة؟

المحلول

انه بسبب array_unique يقارن العناصر باستخدام مقارنة السلسلة. من مستندات:

ملاحظة: يعتبر عنصرين متساويين إذا وفقط إذا (سلسلة) $ ELEM1 === (سلسلة) $ ELEM2. بالكلمات: عندما يكون تمثيل السلسلة هو نفسه. سيتم استخدام العنصر الأول.

تمثيل سلسلة الصفيف هو ببساطة الكلمة Array, ، بغض النظر عن محتوياتها.

يمكنك أن تفعل ما تريد القيام به باستخدام ما يلي:

$arr = array(
    array('user_id' => 33, 'frame_id' => 3),
    array('user_id' => 33, 'frame_id' => 3),
    array('user_id' => 33, 'frame_id' => 8)
);

$arr = array_intersect_key($arr, array_unique(array_map('serialize', $arr)));

//result:
array
  0 => 
    array
      'user_id' => int 33
      'user' => int 3
  2 => 
    array
      'user_id' => int 33
      'user' => int 8

وإليك كيف يعمل:

  1. يتم تسلسل كل عنصر صفيف. سيكون هذا فريدًا بناءً على محتويات الصفيف.

  2. يتم تشغيل نتائج هذا array_unique، لذلك يتم ترك المصفوفات فقط مع توقيعات فريدة من نوعها.

  3. array_intersect_key سيأخذ مفاتيح العناصر الفريدة من الخريطة/الوظيفة الفريدة (نظرًا لأن مفاتيح صفيف المصدر محفوظة) وسحبها من صفيف المصدر الأصلي.

نصائح أخرى

array_unique() يدعم فقط المصفوفات متعددة الأبعاد في PHP 5.2.9 وأعلى.

بدلاً من ذلك ، يمكنك إنشاء تجزئة من الصفيف والتحقق منها للحصول على فريدة من نوعها.

$hashes = array(); 

foreach($array as $val) { 
    $hashes[md5(serialize($val))] = $val; 
} 

array_unique($hashes);

إليك نسخة محسنة من @إجابة Ryeguy:

<?php

$arr = array(
    array('user_id' => 33, 'tmp_id' => 3),
    array('user_id' => 33, 'tmp_id' => 4),
    array('user_id' => 33, 'tmp_id' => 5)
);


# $arr = array_intersect_key($arr, array_unique(array_map('serialize', $arr)));
$arr = array_intersect_key($arr, array_unique(array_map(function ($el) {
    return $el['user_id'];
}, $arr)));

//result:
array
  0 => 
    array
      'user_id' => int 33
      'tmp_id' => int 3

أولاً ، لا يفعل التسلسل غير الضروري. ثانياً ، قد تكون السمات في بعض الأحيان مختلفة حتى معرف هو نفسه.

لقد صادفتها مع جوجل تضع API. كنت أجمع نتائج العديد من الطلبات ونوع مختلف من الكائنات (Think Tags). لكنني حصلت على التكرارات ، حيث قد يتم وضع كائن في عدة فئات (أنواع). والطريقة مع serialize لم تنجح ، لأن attrs كانت مختلفة ، وهي ، photo_reference و reference. ربما هذه مثل هوية المؤقتة.

array_unique deos لا يعمل عودية ، لذلك يعتقد فقط "هذا كل شيء ArrayS ، دعنا نقتل الجميع باستثناء واحد ... هنا نذهب! "

إجابة سريعة (TL ؛ DR)

  • قد يتم استخراج قيم متميزة من مجموعة PHP من أجهزة المساعدات باستخدام Foreach
  • هذا نهج مبسط

إجابة مفصلة

سياق

  • PHP 5.3
  • مجموعة PHP من أجهزة المساعدات (متغير البيانات المركب Tabluar)
  • الاسم البديل لهذا المتغير المركب هو arrayofdictionary (AOD)

مشكلة

  • سيناريو: يحتوي DeveloperMarSher على متغير مركب PHP Tabular
    • يرغب DeveloperMarsher في استخراج قيم مميزة على زوج معين من القيمة
    • في المثال أدناه ، يرغب DeveloperMarsher في الحصول على صفوف لكل متميزة fname زوج القيمة

المحلول

  • example01 ؛؛ يبدأ DeveloperMarsher بمتغير بيانات Tabluar الذي يبدو هكذا

    $aodtable = json_decode('[
    {
      "fname": "homer"
      ,"lname": "simpson"
    },
    {
      "fname": "homer"
      ,"lname": "jackson"
    },
    {
      "fname": "homer"
      ,"lname": "johnson"
    },
    {
      "fname": "bart"
      ,"lname": "johnson"
    },
    {
      "fname": "bart"
      ,"lname": "jackson"
    },
    {
      "fname": "bart"
      ,"lname": "simpson"
    },
    {
      "fname": "fred"
      ,"lname": "flintstone"
    }
    ]',true);
    
  • example01 ؛؛ يمكن لـ DeveloperMarsher استخلاص قيم مميزة مع حلقة foreach التي تتتبع القيم التي شوهدت

    $sgfield  =   'fname';
    $bgnocase =   true;
    
    //
    $targfield  =   $sgfield;
    $ddseen     =   Array();
    $vout       =   Array();
    foreach ($aodtable as $datarow) {
    if( (boolean) $bgnocase == true ){ @$datarow[$targfield] = @strtolower($datarow[$targfield]); }
    if( (string) @$ddseen[ $datarow[$targfield] ] == '' ){
      $rowout   = array_intersect_key($datarow, array_flip(array_keys($datarow)));
      $ddseen[ $datarow[$targfield] ] = $datarow[$targfield];
      $vout[] = Array( $rowout );
    }
    }
    //;;
    
    print var_export( $vout, true );
    

نتيجة الإخراج

array (
  0 =>
  array (
    0 =>
    array (
      'fname' => 'homer',
      'lname' => 'simpson',
    ),
  ),
  1 =>
  array (
    0 =>
    array (
      'fname' => 'bart',
      'lname' => 'johnson',
    ),
  ),
  2 =>
  array (
    0 =>
    array (
      'fname' => 'fred',
      'lname' => 'flintstone',
    ),
  ),
)

المزالق

  • لا يجمع هذا الحل في الحقول التي ليست جزءًا من العملية المتميزة
  • يتم إرجاع أزواج القيمة التعسفية من صفوف متميزة تم اختيارها بشكل تعسفي
  • ترتيب الفرز التعسفي للإخراج
  • التعامل التعسفي لحالات الحروف (هل رأس المال متميز عن الحالة السفلية A؟)

أنظر أيضا

  • php array_intersect_key
  • php array_flip
function array_unique_recursive($array)
{
    $array = array_unique($array, SORT_REGULAR);

    foreach ($array as $key => $elem) {
        if (is_array($elem)) {
            $array[$key] = array_unique_recursive($elem);
        }
    }

    return $array;
}

ألا يفعل ذلك الخدعة؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top