368 votes

Comment supprimer les valeurs dupliquées d'un tableau multidimensionnel en PHP

Comment supprimer les valeurs en double d'un tableau multidimensionnel en PHP ?

Exemple de tableau :

Array
(
    [0] => Array
    (
        [0] => abc
        [1] => def
    )

    [1] => Array
    (
        [0] => ghi
        [1] => jkl
    )

    [2] => Array
    (
        [0] => mno
        [1] => pql
    )

    [3] => Array
    (
        [0] => abc
        [1] => def
    )

    [4] => Array
    (
        [0] => ghi
        [1] => jkl
    )

    [5] => Array
    (
        [0] => mno
        [1] => pql
    )

)

2 votes

Cette question n'a pas de exemple minimal reproductible . Nous disposons d'une entrée, mais pas de l'expression exacte de la sortie souhaitée. Cela conduit à des réponses divergentes qui respectent les deux colonnes pour l'unicité ou qui ne respectent qu'une seule des colonnes pour l'unicité.

736voto

daveilers Points 1744

Voici un autre moyen. Aucune variable intermédiaire n'est sauvegardée.

Nous l'avons utilisé pour dé-dupliquer les résultats d'une variété de requêtes qui se chevauchent.

$input = array_map("unserialize", array_unique(array_map("serialize", $input)));

34 votes

A cause de unserialize, c'est de plus en plus lent au fur et à mesure que le tableau est plus grand et plus complexe. Il y a une raison pour laquelle j'ai utilisé array_intersect_key (six mois avant cette réponse).

1 votes

@OIS ils voulaient une ligne unique je suppose. ils auraient dû juste réécrire comme $no-duplicates = array_intersect_key( $array , array_unique( array_map('serialize') , $array ) ) ;

18 votes

@OIS je viens de le tester, il y avait une faute de frappe mais cela fonctionne merci mec! : $no_duplicates = array_intersect_key( $array , array_unique( array_map('serialize' , $array ) ) ) ;

312voto

Jack Points 88446

Depuis la version 5.2.9, vous pouvez utiliser array_unique() si vous utilisez le SORT_REGULAR drapeau comme ceci :

array_unique($array, SORT_REGULAR);

Cela fait que la fonction compare les éléments pour l'égalité comme si $a == $b étaient utilisés, ce qui est parfait pour votre cas.

Sortie

Array
(
    [0] => Array
        (
            [0] => abc
            [1] => def
        )

    [1] => Array
        (
            [0] => ghi
            [1] => jkl
        )

    [2] => Array
        (
            [0] => mno
            [1] => pql
        )

)

Gardez à l'esprit, cependant, que la documentation États :

array_unique() n'est pas conçu pour fonctionner sur des tableaux multidimensionnels.

2 votes

Je pense que cette solution est plus rapide et plus claire que celle qui a été acceptée ! votons pour celle-ci ! :) Hmmm sur le site php on peut voir que ce n'est pas si rapide, comme je le pensais...

5 votes

Il est étrange que l'utilisation du drapeau SORT_REGULAR ne fonctionne pas pour moi, pour supprimer les tableaux en double.

0 votes

@Stefan, vous devriez peut-être envisager de poser une nouvelle question.

70voto

OIS Points 5566

Un autre moyen. Cela préservera aussi les clés.

function array_unique_multidimensional($input)
{
    $serialized = array_map('serialize', $input);
    $unique = array_unique($serialized);
    return array_intersect_key($input, $unique);
}

1 votes

Pour les grands tableaux, cette méthode est souvent au moins 50% plus rapide que la réponse acceptée.

68voto

Rajendrasinh Points 59

J'ai eu un problème similaire mais j'ai trouvé une solution qui fonctionne à 100%.

<?php
    function super_unique($array,$key)
    {
       $temp_array = [];
       foreach ($array as &$v) {
           if (!isset($temp_array[$v[$key]]))
           $temp_array[$v[$key]] =& $v;
       }
       $array = array_values($temp_array);
       return $array;

    }

$arr="";
$arr[0]['id']=0;
$arr[0]['titel']="ABC";
$arr[1]['id']=1;
$arr[1]['titel']="DEF";
$arr[2]['id']=2;
$arr[2]['titel']="ABC";
$arr[3]['id']=3;
$arr[3]['titel']="XYZ";

echo "<pre>";
print_r($arr);
echo "unique*********************<br/>";
print_r(super_unique($arr,'titel'));

?>

1 votes

Ceci répond à une autre question. Voir ici : stackoverflow.com/questions/4585208/

0 votes

Excellente fonction ! et au cas où vous auriez affaire à des objets : if(!isset($array->$v->$key)) $array[$v->$key] =& $v ;

0 votes

La modification par référence dans cette réponse est tout à fait inutile. Je suis d'accord avec l'OIS, cette réponse ne respecte pas les deux colonnes lors de la détermination de l'unicité. Il s'agit de la bonne réponse à une autre question.

22voto

Jeremy Ruten Points 59989

Les commentaires des utilisateurs sur le array_unique() La documentation a de nombreuses solutions à ce sujet. Voici l'une d'entre elles :

kenrbnsn at rbnsn dot com
27-Sep-2005 12:09

Encore un autre Array_Unique pour les tableaux multidimensionnels. Je ne l'ai testé que sur des tableaux à deux dimensions, mais on pourrait probablement le généraliser à d'autres, ou le faire utiliser la récursion.

Cette fonction utilise les fonctions serialize, array_unique et unserialize pour effectuer le travail.

function multi_unique($array) {
    foreach ($array as $k=>$na)
        $new[$k] = serialize($na);
    $uniq = array_unique($new);
    foreach($uniq as $k=>$ser)
        $new1[$k] = unserialize($ser);
    return ($new1);
}

Cela vient de http://ca3.php.net/manual/en/function.array-unique.php#57202 .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X