Question

J'utilise la paix de code suivante pour générer un tableau:

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

Et le résultat est:

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

Quelqu'un peut-il m'expliquer, pourquoi j'obtiens un tableau avec un seul élément de array_unique?

Était-ce utile?

La solution

Les éléments du tableau sont convertis en chaînes à des fins de comparaison - voici l'extrait pertinent de la page de manuel de array_unique

  

Remarque: Deux éléments sont considérés   égal si et seulement si (chaîne) $ elem1   === (chaîne) $ elem2. En mots: quand la représentation de la chaîne est la même.   Le premier élément sera utilisé.

Une fois que vos éléments de tableau sont convertis en chaînes, ils ont simplement la valeur "Array", ce qui bien sûr rend chaque élément identique, et vous vous retrouvez avec le premier élément uniquement.

Voici un moyen de supprimer les doublons d'un tableau comme le vôtre

$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

Autres conseils

J'imagine que puisque $ selected est un tableau multidimensionnel, $ selected [0] est identique à $ selected [1], un tableau.

Autant que je sache, array_unique teste (chaîne) $ valeur1 === (chaîne) $ valeur2, vous obtenez donc "Tableau" == "Tableau".

Vous n'avez pas vraiment expliqué ce qui rend un élément 'unique' (l'URI?). Pour comparer des structures entières, vous pouvez essayer de boucler via $ selected, de sérialiser les valeurs (en utilisant serialize ()), puis d’appeler array_unique sur ces valeurs. Ensuite, appelez unserialize pour ramener la matrice à la normale.

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

?>

Ce n’est pas la solution la plus efficace, mais j’aimerais faire un point de repère avant d’inquiéter.

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

array_unique supprime les doublons en comparant la valeur de chaîne des éléments. La valeur de chaîne d'un tableau est toujours "Tableau", indépendamment du contenu du tableau.

Cela signifie que tous les éléments de votre tableau ont la valeur de chaîne "Tableau" et sont donc considérés comme des doublons. Ils sont donc supprimés, à l'exception du premier.

Vous devriez écrire votre propre fonction array_unique qui fonctionne en comparant le 'uri' des éléments.

Si les éléments du tableau sont déjà triés, vous pouvez trouver les valeurs uniques suivantes:

$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];
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top