php array_unique garip davranış

4 Cevap php

Ben çıktı bir dizi kod barış aşağıdaki kullanıyorum:

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

Ve çıktı:

======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)

I array_unique sadece bir öğe ile dizi olsun neden birisi bana açıklayabilir misin?

4 Cevap

Dizi elemanları karşılaştırma için dizelere döküm - burada manual page for array_unique adlı alakalı pasajı var

Note: Two elements are considered equal if and only if (string) $elem1 === (string) $elem2. In words: when the string representation is the same. The first element will be used.

Lütfen dizi elemanları dizelere döküm sonra, onlar sadece tabii her eleman aynı görünmesini sağlar değer "Array" var, ve sadece ilk elemanı ile rüzgar.

Burada sizin gibi bir diziden çiftleri kaldırmak için tek bir yol var

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

Ben seçilmiş $ çok boyutlu bir dizi olduğundan, seçilen $ [0] [1], bir dizi seçilmiş $ olarak aynı olduğunu düşünün.

Bildiğim kadarıyla, array_unique testler (string) $ değer1'den === (string) $ value2, sen == 'Dizi' olsun 'Dizi'.

Eğer gerçekten 'benzersiz' bir unsuru kılan izah değil (URI?). Bütün yapıları karşılaştırmak için seçilen $ döngü değerleri (serialize () kullanarak) seri hale ve sonra da bu değerler üzerine array_unique arama denemek isteyebilirsiniz. Sonra normale dizi dönmek için unserialize diyoruz.

<?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;
}

?>

Ben bu konuda endişe önce, en etkili çözüm değil, ama ben ilk kriter olur.

Bkz: http://codepad.org/6cs5b0sm

array_unique elemanlarının dize değerini karşılaştırarak çiftleri kaldırır. Bir dizinin dize değeri her dizinin içeriğinin bağımsız "Dizi" dir.

Bu dizinin bütün elemanları dize değeri "Array" var, ve bu nedenle çiftleri olarak kabul edilir, ve ilki hariç kaldırılır demektir.

Sen elemanlarının 'uri' karşılaştırarak çalışır kendi array_unique fonksiyon yazmak gerekir.

Dizi elemanları zaten sıralanır, bu ile eşsiz değerleri bulabilirsiniz:

$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];
    }
}