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

156

Comment puis-je supprimer les valeurs en double d'un tableau en PHP?

Ian
la source

Réponses:

252

Utilisez array_unique () .

Exemple:

$array = array(1, 2, 2, 3);
$array = array_unique($array); // Array is now (1, 2, 3)
Jeremy Ruten
la source
20
@Ian -Note that array_unique() is not intended to work on multi dimensional arrays.
Peter Ajtai
18
Ce qui précède conservera les clés des éléments. Si vous voulez les réindexer, appliquez en plus array_values: php.net/manual/en/function.array-values.php
CodeVirtuoso
3
Cela $array = array_unique($array, SORT_REGULAR);
n'a
1
@PeterAjtai: Merci d'avoir mis en évidence dans la section des commentaires. Cela m'a fait gagner beaucoup de temps.
Nana Partykar
29

Utilisation array_values(array_unique($array));

array_unique: pour un tableau unique array_values: pour la réindexation

nimey sara thomas
la source
1
+1 array_uniquerenvoie un objet avec des paires clé et valeur ET array_valuesne renvoie que des valeurs sous forme de tableau.
narainsagar le
24
//Find duplicates 

$arr = array( 
    'unique', 
    'duplicate', 
    'distinct', 
    'justone', 
    'three3', 
    'duplicate', 
    'three3', 
    'three3', 
    'onlyone' 
);

$unique = array_unique($arr); 
$dupes = array_diff_key( $arr, $unique ); 
    // array( 5=>'duplicate', 6=>'three3' 7=>'three3' )

// count duplicates

array_count_values($dupes); // array( 'duplicate'=>1, 'three3'=>2 )
chim
la source
9

La seule chose qui a fonctionné pour moi est:

$array = array_unique($array, SORT_REGULAR);

Edit: SORT_REGULARconserve le même ordre du tableau d'origine.

iniravpatel
la source
8
$result = array();
foreach ($array as $key => $value){
  if(!in_array($value, $result))
    $result[$key]=$value;
}
Amr Berag
la source
5

parfois, ce array_unique()n'est pas le cas, si vous voulez obtenir des éléments uniques ET dupliqués ...

$unique=array("","A1","","A2","","A1","");
$duplicated=array();

foreach($unique as $k=>$v) {

if( ($kt=array_search($v,$unique))!==false and $k!=$kt )
 { unset($unique[$kt]);  $duplicated[]=$v; }

}

sort($unique); // optional
sort($duplicated); // optional

résultats sur

array ( 0 => '', 1 => 'A1', 2 => 'A2', ) /* $unique */

array ( 0 => '', 1 => '', 2 => '', 3 => 'A1', ) /* $duplicated */
AgelessEssence
la source
3

Nous pouvons créer un tel type de tableau pour utiliser cette dernière valeur qui sera mise à jour en colonne ou en valeur clé et nous obtiendrons une valeur unique du tableau ...

$array = array (1,3,4,2,1,7,4,9,7,5,9);
    $data=array();
    foreach($array as $value ){

        $data[$value]= $value;

    }

    array_keys($data);
    OR
    array_values($data);
kumar dur
la source
2

explode(",", implode(",", array_unique(explode(",", $YOUR_ARRAY))));

Cela prendra en charge les associations de clés et sérialisera les clés pour le nouveau tableau résultant :-)

Deb
la source
1
Quel serait l'effet de explode("," $YOUR_ARRAY)quand $YOUR_ARRAYest array("1", "2", "3")?
kiamlaluno
@kiamlaluno - :) et la réponse est: Attention: explode () s'attend à ce que le paramètre 2 soit une chaîne, un tableau donné en ... en ligne ....
Jesse Chisholm
@JesseChisholm Oui, c'était le but, mais personne n'a remarqué le code, apparemment.
kiamlaluno
2

En fonction de la taille de votre tableau, j'ai trouvé

$array = array_values( array_flip( array_flip( $array ) ) );

peut être plus rapide que array_unique.

Bollis
la source
Plus d'informations sur ce qui se passe ici et serait-ce plus rapide avec un tableau plus grand ou plus petit.
Fi Horan
Le double flip va supprimer les valeurs dupliquées, car une clé ne peut pas exister deux fois, sinon elle est écrasée. Si une valeur est dupliquée et que le tableau est inversé, la dernière occurrence (je suppose) sera la valeur de la clé.
Goldentoa 11
En PHP 7, j'ai remarqué que retourner plusieurs fois un tableau multidimensionnel peut réorganiser les éléments du tableau de manière inattendue.
Josh Habdas
1

C'est une excellente façon de le faire. Vous voudrez peut-être vous assurer que sa sortie est à nouveau un tableau. Désormais, vous n'affichez que la dernière valeur unique.

Essaye ça:

$arrDuplicate = array ("","",1,3,"",5);

foreach (array_unique($arrDuplicate) as $v){
  if($v != "") { $arrRemoved[] = $v; }
}
print_r ($arrRemoved);
Sèche B
la source
1
    if (@!in_array($classified->category,$arr)){        
                                    $arr[] = $classified->category;
                                 ?>

            <?php } endwhile; wp_reset_query(); ?>

première fois vérifier la valeur dans le tableau et trouver la même valeur l'ignorer

Alpesh Navadiya
la source
1

Supprimez les valeurs en double d'un tableau associatif en PHP.

$arrDup = Array ('0' => 'aaa-aaa' , 'SKU' => 'aaa-aaa' , '1' => '12/1/1' , 'date' => '12/1/1' , '2' => '1.15' , 'cost' => '1.15' );

foreach($arrDup as $k =>  $v){
  if(!( isset ($hold[$v])))
      $hold[$v]=1;
  else
      unset($arrDup[$k]);
}

Tableau ([0] => aaa-aaa [1] => 12/1/1 [2] => 1,15)

Shivivanand
la source
1

Il peut y avoir plusieurs façons de procéder, qui sont les suivantes

//first method
$filter = array_map("unserialize", array_unique(array_map("serialize", $arr)));

//second method
$array = array_unique($arr, SORT_REGULAR);
Shahrukh Anwar
la source
1

Si vous êtes préoccupé par les performances et avez un tableau simple, utilisez:

array_keys(array_flip($array));

C'est plusieurs fois plus rapide que array_unique.

michal.jakubeczy
la source
1
$a = array(1, 2, 3, 4); 
$b = array(1, 6, 5, 2, 9); 
$c = array_merge($a, $b);
$unique = array_keys(array_flip($c));
print_r($unique);
Pawan Kumar
la source
Le moyen le plus rapide d'y parvenir est d'utiliser la fonction array_flip intégrée à PHP [1]. array_flip échangera les valeurs du tableau avec leurs clés et comme un tableau ne peut pas avoir de clés en double, vous vous retrouverez avec un ensemble unique de clés qui correspondent aux valeurs du tableau d'origine. Pour récupérer ces clés en tant que valeurs, vous pouvez utiliser la fonction array_keys pour récupérer vos valeurs uniques. Array_flip et array_keys sont des fonctions O (n) du pire des cas tandis que array_unique a le pire des cas de O (n log (n)). [2]
pawan kumar
1
Veuillez ajouter quelques explications supplémentaires à votre réponse (pas à la section des commentaires!). Comment le code donné supprime-t-il les valeurs en double d'un seul tableau? Pourquoi avez-vous besoin de deux tableaux pour cela?
Nico Haase
Bienvenue dans StackOverflow! Je vois que vous avez ajouté quelques explications dans les commentaires de votre réponse, il serait utile que vous ajoutiez cette information dans le cadre de votre réponse elle-même.
n4m31ess_c0d3r
Il semble plus raisonnable d'ajouter ce commentaire en tant que modification à une réponse déjà ancienne ( stackoverflow.com/a/52591730/2109067 ).
ankhzet
Vous pouvez utiliser un seul tableau avec des éléments en double. J'ai eu un problème pour obtenir les valeurs de deux tableaux en un, puis supprimer les doublons.
pawan kumar
0
$arrDuplicate = array ("","",1,3,"",5);
 foreach(array_unique($arrDuplicate) as $v){
  if($v != "" ){$arrRemoved = $v;  }}
print_r($arrRemoved);
utilisateur1045247
la source
1
Cela n'explique vraiment rien, et cela ne semble pas être "plus intelligent".
Sven
Vous pouvez toujours expliquer pourquoi en éditant votre propre message, il vous suffit de cliquer sur le lien «modifier» à la fin de votre réponse. Je vous suggère également de jeter un œil à la FAQ: stackoverflow.com/faq
ForceMagic
0
function arrayUnique($myArray)
{
    $newArray = Array();
    if (is_array($myArray))
    {
        foreach($myArray as $key=>$val)
        {
            if (is_array($val))
            {
                $val2 = arrayUnique($val);
            }
            else
            {
                $val2 = $val;
                $newArray=array_unique($myArray);
                $newArray=deleteEmpty($newArray);
                break;
            }
            if (!empty($val2))
            {
                $newArray[$key] = $val2;
            }
        }
    }
    return ($newArray);
}

function deleteEmpty($myArray)
{
    $retArray= Array();
    foreach($myArray as $key=>$val)
    {
        if (($key<>"") && ($val<>""))
        {
            $retArray[$key] = $val;
        }
    }
    return $retArray;
}
Vineesh Kalarickal
la source
0

essayez ce code court et doux -

$array = array (1,4,2,1,7,4,9,7,5,9);
$unique = array();

foreach($array as $v){
  isset($k[$v]) || ($k[$v]=1) && $unique[] = $v;
  }

var_dump($unique);

Production -

array(6) {
  [0]=>
  int(1)
  [1]=>
  int(4)
  [2]=>
  int(2)
  [3]=>
  int(7)
  [4]=>
  int(9)
  [5]=>
  int(5)
}
Rohit Suthar
la source
1
Abuser d'opérateurs booléens pour contrôler un flux comme celui-ci est inutilement déroutant. Utilisez simplement if.
Mark Amery
0
<?php
$arr1 = [1,1,2,3,4,5,6,3,1,3,5,3,20];    
print_r(arr_unique($arr1));


function arr_unique($arr) {
  sort($arr);
  $curr = $arr[0];
  $uni_arr[] = $arr[0];
  for($i=0; $i<count($arr);$i++){
      if($curr != $arr[$i]) {
        $uni_arr[] = $arr[$i];
        $curr = $arr[$i];
      }
  }
  return $uni_arr;
}
sumityadavbadli
la source
Mettre count ($ arr) dans la boucle est assez lent
Kiruahxh
0

Ici, j'ai créé un deuxième tableau vide et utilisé une forboucle avec le premier tableau qui a des doublons. Il s'exécutera autant de fois que le nombre du premier tableau. Ensuite, comparé à la position du tableau avec le premier tableau et correspond au fait qu'il a déjà cet élément ou non en utilisant in_array. Sinon, il ajoutera cet élément au deuxième tableau avec array_push.

$a = array(1,2,3,1,3,4,5);
$count = count($a);
$b = [];
for($i=0; $i<$count; $i++){
    if(!in_array($a[$i], $b)){
        array_push($b, $a[$i]);
    }
}
print_r ($b);
Aladin Banwal
la source
Pouvez-vous partager quelques explications sur ce code? Par exemple, pourquoi n'utilisez-vous pas une foreachboucle?
Nico Haase
C'est une sorte de forme de faire et pourquoi je ne l'ai pas utilisé foreachparce que je suis très à l'aise avec la boucle for. C'est tout.
Aladin Banwal
Néanmoins, vous devriez partager quelques explications avec le code. Publier de telles réponses sur SO n'est pas un bon style: des personnes ayant le même problème que l'OP pourraient venir, et elles devraient être en mesure de comprendre comment votre code résout le problème afin qu'elles puissent en tirer des leçons et l'adapter à leurs besoins
Nico Haase
0

Cela peut être fait grâce à la fonction J'ai fait trois fonctions dupliquées renvoyant les valeurs qui sont dupliquées dans le tableau.

La deuxième fonction simple ne renvoie que les valeurs qui sont simples signifie non répétées dans le tableau et la troisième et la fonction complète renvoient toutes les valeurs mais non dupliquées si une valeur est dupliquée, elle la convertit en simple;

function duplicate($arr) {
    $duplicate;
    $count = array_count_values($arr);
    foreach($arr as $key => $value) {
        if ($count[$value] > 1) {
            $duplicate[$value] = $value;
        }
    }
    return $duplicate;
}
function single($arr) {
    $single;
    $count = array_count_values($arr);
    foreach($arr as $key => $value) {
        if ($count[$value] == 1) {
            $single[$value] = $value;
        }
    }
    return $single;
}
function full($arr, $arry) {
    $full = $arr + $arry;
    sort($full);
    return $full;
}
Mirza Obaid
la source
0
$array = array("a" => "moon", "star", "b" => "moon", "star", "sky");

// Deleting the duplicate items
$result = array_unique($array);
print_r($result);

ref: Démo

nageen nayak
la source
1
Quel est l'intérêt de répondre à cette question avec array_unique 11 ans après la réponse originale qui est exactement celle-ci?
Dylan Kas
0

Une alternative à la fonction array_unique ().

Utilisation de l'algorithme de force brute

// [1] Voici notre tableau avec des éléments dupliqués

$ matches = ["jorge", "melvin", "chelsy", "melvin", "jorge", "smith"];

// [2] Conteneur pour le nouveau tableau sans aucun élément dupliqué

$ arr = [];

// [3] récupère la longueur du tableau dupliqué et définit la valeur var len à utiliser pour la boucle for

$ len = count ($ correspond);

// [4] Si correspond à la clé du tableau ($ i) boucle courante L'itération n'est pas disponible dans // [4] le tableau $ arr puis pousse la valeur de la clé d'itération courante des correspondances [$ i] // [4] au tableau arr.

pour ($ i = 0; $ i if(array_search($matches[$i], $arr) === false){ array_push($arr,$matches[$i]); } } //print the array $arr. print_r($arr); //Result: Array ( [0] => jorge [1] => melvin [2] => chelsy [3] => smith )

Richard Ramos
la source
-2

J'ai fait cela sans utiliser aucune fonction.

$arr = array("1", "2", "3", "4", "5", "4", "2", "1");

$len = count($arr);
for ($i = 0; $i < $len; $i++) {
  $temp = $arr[$i];
  $j = $i;
  for ($k = 0; $k < $len; $k++) {
    if ($k != $j) {
      if ($temp == $arr[$k]) {
        echo $temp."<br>";
        $arr[$k]=" ";
      }
    }
  }
}

for ($i = 0; $i < $len; $i++) {
  echo $arr[$i] . " <br><br>";
}
Ashishdmc4
la source