سؤال

أنا باستخدام عقب السلام من التعليمات البرمجية إلى إخراج مجموعة:

echo "======output without array_unique=====";
var_dump($selected);
echo "=====output with array_unique=====";
var_dump(array_unique($selected));die;                

و الناتج هو:

======output without array_unique=====

array
  0 => 
    array
      'uri' => string 'http://localhost/conferences/tags/0caf4c990e0a385156b33fee58e7e3fb' (length=63)
      'tag' => string '1' (length=1)
      'weight' => float 4
      'selected' => string 'select' (length=6)
  1 => 
    array
      'uri' => string 'http://localhost/conferences/tags/0caf4c990e0a385156b33fee58e7e3fb' (length=63)
      'tag' => string '1' (length=1)
      'weight' => float 4
      'selected' => string 'select' (length=6)
  2 => 
    array
      'uri' => string 'http://localhost/conferences/tags/ffc709d5131f752df8aae22d7da4240f' (length=63)
      'tag' => string '2' (length=1)
      'weight' => float 4
      'selected' => string '' (length=0)
  3 => 
    array
      'uri' => string 'http://localhost/conferences/tags/035c60c7f090412cc905cee008fbeba8' (length=63)
      'tag' => string '3' (length=1)
      'weight' => float 0
      'selected' => string '' (length=0)
  4 => 
    array
      'uri' => string 'http://localhost/conferences/tags/4137dbc16ef1a2079eb6cacb62dd8521' (length=63)
      'tag' => string '4' (length=1)
      'weight' => float 0
      'selected' => string '' (length=0)

=====output with array_unique=====

array
  0 => 
    array
      'uri' => string 'http://localhost/conferences/tags/0caf4c990e0a385156b33fee58e7e3fb' (length=63)
      'tag' => string '1' (length=1)
      'weight' => float 4
      'selected' => string 'select' (length=6)

يمكن للشخص أن يفسر لي لماذا أحصل على مجموعة مع عنصر واحد فقط من array_unique?

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

المحلول

مجموعة العناصر المدلى بها سلاسل من أجل المقارنة هنا هي ذات الصلة مقتطف من دليل الصفحة array_unique

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

مرة واحدة لديك مجموعة العناصر يلقي إلى سلاسل, انهم ببساطة قيمة "مجموعة" ، والتي بالطبع يجعل كل عنصر ننظر نفسه ، تصل الرياح مع أول عنصر.

هنا طريقة يمكنك إزالة التكرارات من مجموعة مثلك

$seen=array();
foreach ($myarray as $key=>$val) {
    if (isset($seen[$val['uri']])) {
        unset($myarray[$key]);    // remove duplicate
    } else {
        $seen[$val['uri']]=$key;  // remember this
    }
}
unset($seen); // don't need this any more

نصائح أخرى

وأتصور أنه منذ $ المحدد هو مجموعة متعددة الأبعاد، $ مختارة [0] هو نفس $ مختارة [1]، صفيف.

وبقدر ما أعرف، اختبارات array_unique (سلسلة) $ VALUE1 === (سلسلة) $ و value2، حتى تحصل على "صفيف '==' صفيف".

ولقد أوضح ليس حقا ما يجعل عنصر 'فريد' (وURI؟). لمقارنة هياكل بأكملها، قد ترغب في محاولة حلقات من خلال $ المختارة، تسلسل القيم (باستخدام تسلسل ()) ثم استدعاء array_unique على تلك القيم. ثم استدعاء unserialize للعودة صفيف إلى وضعها الطبيعي.

<?php

function multi_array_unique($arr) {
    foreach ($arr as &$elm) {
        $elm = serialize($elm);
    }

    $arr = array_unique($arr);

    foreach ($arr as &$elm) {
        $elm = unserialize($elm);
    }

    return $arr;
}

?>

وانها ليست الحل الأكثر فعالية، ولكن أود أن المؤشر أولا، قبل أن تقلق بشأن ذلك.

وانظر: http://codepad.org/6cs5b0sm

وarray_unique يزيل مكررة بمقارنة قيمة سلسلة من العناصر. قيمة السلسلة من مجموعة دائما "صفيف"، مستقلة عن محتويات المصفوفة.

وهذا يعني أن جميع عناصر مجموعة الخاصة بك يكون لها قيمة السلسلة "صفيف"، وبالتالي تعتبر مكررة، وتتم إزالة باستثناء أول واحد.

ويجب عليك أن تكتب وظيفة array_unique الخاصة التي تعمل عن طريق مقارنة "أوري" من العناصر.

إذا يتم فرز عناصر مجموعة بالفعل، يمكنك العثور على قيم فريدة مع هذا:

$unique = array();
$n = count($array);
if ($n < 2) {
    $unique = $array;
} else {
    for ($i=0; $i<$n-1; ++$i) {
        $unique[] = $array[$i];
        if ($array[$i] === $array[$i+1]) {
            ++$i;
        }
    }
    if ($i < $n && $array[$n-2] !== $array[$n-1]) {
        $unique[] = $array[$n-1];
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top