Frage

Ich bin mit folgenden Frieden von Code zur Ausgabe eines Arrays:

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

Und der Ausgang ist:

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

Kann jemand mir erklären, warum bekomme ich Array mit nur einem Element aus der array_unique?

War es hilfreich?

Lösung

Die Array-Elemente in Strings zum Vergleich gegossen werden - hier ist der relevante Ausschnitt aus dem Manpage array_unique

  

Hinweis: Zwei Elemente werden als   gleich, wenn und nur wenn (string) $ elem1   === (string) $ elem2. In Worten: Wenn die String-Darstellung ist das gleiche.   Das erste Element verwendet werden.

Sobald Ihre Array-Elemente in Strings werfen, sie einfach den Wert „Array“ haben, was natürlich jedes Element gleich aussehen macht, und Sie landen mit nur dem ersten Element.

Hier ist eine Möglichkeit, Sie Duplikate aus einem Array wie das Ihre entfernen könnten

$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

Andere Tipps

Ich stelle mir vor, dass ausgewählt, da $ ein mehrdimensionales Array, ausgewählt $ [0] ist das gleiche wie $ ausgewählt [1], ein Array.

Soweit ich weiß, array_unique Tests (string) $ value1 === (string) $ value2, so erhalten Sie 'Array' == 'Array'.

Sie haben nicht wirklich erklärt, was ein Element macht ‚einzigartig‘ (die URI?). So vergleichen ganze Strukturen, können Sie durch $ ausgewählt, um zu versuchen Looping, die Werte der Serialisierung (mit serialize ()) und dann auf diesen Werten Aufruf array_unique. Dann rufen Sie unserialize das Array wieder normalisieren.

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

?>

Es ist nicht die effizienteste Lösung, aber ich würde Benchmark zuerst, bevor ich darüber keine Sorgen.

Siehe auch: http://codepad.org/6cs5b0sm

array_unique entfernt Duplikate durch den String-Wert der Elemente zu vergleichen. Der String-Wert eines Arrays ist immer „Array“, unabhängig vom Inhalt des Arrays.

Das bedeutet, dass alle Elemente des Array den String-Wert „Array“ haben und werden daher Duplikate betrachtet und sind mit Ausnahme der ersten entfernt.

Sie sollten Ihre eigene array_unique Funktion schreiben, die durch den Vergleich des ‚uri‘ der Elemente funktionieren.

Wenn die Array-Elemente bereits sortiert sind, können Sie die einzigartigen Werte mit diesem finden:

$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];
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top