Come rimuovere i valori duplicati da un array in PHP


Risposte:


251

Usa array_unique () .

Esempio:

$array = array(1, 2, 2, 3);
$array = array_unique($array); // Array is now (1, 2, 3)

20
@Ian -Note that array_unique() is not intended to work on multi dimensional arrays.
— Peter Ajtai,

18
Quanto sopra conserverà le chiavi degli elementi. Se li volete reindicizzate, oltre applicare array_values: php.net/manual/en/function.array-values.php
— CodeVirtuoso

3
Per me questo non ha funzionato gentilmente: $array = array_unique($array, SORT_REGULAR);
— iniravpatel,

@PeterAjtai: Grazie per aver messo in evidenza nella sezione commenti. Mi ha fatto risparmiare molto tempo.
— Nana Partykar,

29

Uso array_values(array_unique($array));

array_unique: per array univoco array_values: per reindicizzare


1
+1 array_uniquerestituisce un oggetto con coppie chiave e valore E array_valuesrestituisce solo valori come matrice.
— narainsagar,

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 )

9

L'unica cosa che ha funzionato per me è:

$array = array_unique($array, SORT_REGULAR);

Modifica: SORT_REGULARmantiene lo stesso ordine dell'array originale.


8
$result = array();
foreach ($array as $key => $value){
  if(!in_array($value, $result))
    $result[$key]=$value;
}

5

a volte array_unique()non è il modo, se vuoi ottenere oggetti unici e duplicati ...

$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

risultati su

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

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

3

Possiamo creare questo tipo di array per utilizzare l'ultimo valore che verrà aggiornato in colonna o valore chiave e otterremo un valore univoco dall'array ...

$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);

2

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

Questo si occuperà delle associazioni di chiavi e serializzerà le chiavi per il nuovo array risultante :-)


1
Quale sarebbe l'effetto di explode("," $YOUR_ARRAY)quando $YOUR_ARRAYè array("1", "2", "3")?
— kiamlaluno,

@kiamlaluno - :) e la risposta è: Attenzione: explode () si aspetta che il parametro 2 sia stringa, array dato in ... on line ....
— Jesse Chisholm

@JesseChisholm Sì, questo era il punto, ma a quanto pare nessuno ha notato il codice.
— kiamlaluno,

2

A seconda delle dimensioni dell'array, ho trovato

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

può essere più veloce di array_unique.


Ulteriori informazioni su cosa sta succedendo qui e sarebbe più veloce con un array più grande o più piccolo.
— Fi Horan,

La doppia inversione rimuoverà i valori duplicati, poiché una chiave non può esistere due volte, altrimenti viene sovrascritta. Se un valore viene duplicato e l'array viene capovolto, l'ultima occorrenza (presumo) sarà il valore per la chiave.
— Goldentoa11,

In PHP 7 ho notato che capovolgere più volte una matrice multidimensionale può riordinare gli elementi della matrice in modo imprevisto.
— Josh Habdas,

1

È un ottimo modo per farlo. Potrebbe voler assicurarsi che il suo output sia di nuovo un array. Ora stai mostrando solo l'ultimo valore univoco.

Prova questo:

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

foreach (array_unique($arrDuplicate) as $v){
  if($v != "") { $arrRemoved[] = $v; }
}
print_r ($arrRemoved);

1
    if (@!in_array($classified->category,$arr)){        
                                    $arr[] = $classified->category;
                                 ?>

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

prima volta controlla il valore nell'array e trova lo stesso valore ignoralo


1

Rimuovi i valori duplicati da un array associativo in 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]);
}

Array ([0] => aaa-aaa [1] => 12/1/1 [2] => 1.15)


1

Esistono diversi modi per farlo, che sono i seguenti

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

//second method
$array = array_unique($arr, SORT_REGULAR);

1

Se ti preoccupi delle prestazioni e disponi di un array semplice, usa:

array_keys(array_flip($array));

È molte volte più veloce di array_unique.


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

Il modo più rapido per raggiungere questo obiettivo è utilizzare la funzione array_flip integrata in PHP [1]. array_flip scambia i valori dell'array con le loro chiavi e poiché un array non può avere chiavi duplicate, si otterrà un set univoco di chiavi che corrispondono ai valori dell'array originale. Per recuperare queste chiavi come valori è possibile utilizzare la funzione array_keys per recuperare valori univoci. Sia array_flip che array_keys sono le funzioni O (n) nel caso peggiore mentre array_unique ha il caso peggiore di O (n log (n)). [2]
— Pawan Kumar,

1
Aggiungi qualche spiegazione in più alla tua risposta (non alla sezione dei commenti!). In che modo il codice specificato rimuove i valori duplicati da un singolo array? Perché hai bisogno di due array per questo?
— Nico Haase,

Benvenuto in StackOverflow! Vedo che hai aggiunto alcune spiegazioni nei commenti della tua risposta, sarebbe utile se aggiungi queste informazioni come parte della tua stessa risposta.
— n4m31ess_c0d3r

Sembra più ragionevole aggiungere quel commento come modifica a una risposta già esistente da tempo ( stackoverflow.com/a/52591730/2109067 ).
— ankhzet,

È possibile utilizzare un singolo array con elementi duplicati. Ho avuto problemi a ottenere valori da due array in uno, quindi rimuovere i duplicati.
— Pawan Kumar,

0
$arrDuplicate = array ("","",1,3,"",5);
 foreach(array_unique($arrDuplicate) as $v){
  if($v != "" ){$arrRemoved = $v;  }}
print_r($arrRemoved);

1
Questo in realtà non spiega nulla e non sembra essere "più intelligente".
— Sven

Puoi sempre spiegare perché modificando il tuo post, fai clic sul link "modifica" alla fine della tua risposta. Vi suggerisco inoltre di avere uno sguardo alle 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;
}

0

prova questo codice breve e dolce -

$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);

Produzione -

array(6) {
  [0]=>
  int(1)
  [1]=>
  int(4)
  [2]=>
  int(2)
  [3]=>
  int(7)
  [4]=>
  int(9)
  [5]=>
  int(5)
}

1
Abusare di operatori booleani per un flusso di controllo come questo è inutilmente confuso. Basta usare 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;
}

Mettere il conteggio ($ arr) nel loop è piuttosto lento
— Kiruahxh

0

Qui ho creato un secondo array vuoto e ho usato il forloop con il primo array con duplicati. Funzionerà tante volte quanto il conteggio del primo array. Quindi confrontato con la posizione dell'array con il primo array e ho trovato che ha già questo elemento usando o meno in_array. Altrimenti aggiungerà quell'elemento al secondo array con 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);

Puoi condividere qualche spiegazione su quel codice? Ad esempio, perché non usi un foreachloop?
— Nico Haase,

Questa è una sorta di modo di fare e perché non l'ho usata foreachperché mi sento molto a mio agio con il ciclo. Questo è tutto.
— Aladin Banwal,

Tuttavia, dovresti condividere alcune spiegazioni con il codice. Pubblicare tali risposte su SO non è un buon stile: le persone con lo stesso problema dell'OP potrebbero presentarsi e dovrebbero essere in grado di capire come il codice risolve il problema in modo che possano imparare da esso e adottarlo alle loro esigenze
— Nico Haase,

0

Può essere fatto tramite la funzione che ho reso duplicato di tre funzioni restituisce i valori che sono duplicati nella matrice.

La seconda funzione restituisce solo quei valori che sono una sola media non ripetuti nell'array e la terza e la funzione completa restituiscono tutti i valori ma non duplicati se viene duplicato qualsiasi valore, convertendolo in singolo;

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

0
$array = array("a" => "moon", "star", "b" => "moon", "star", "sky");

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

rif: Demo


1
Qual è il punto di rispondere a questa domanda con array_unique 11 anni dopo la risposta originale che è esattamente questa?
— Dylan Kas,

0

Un'alternativa per la funzione array_unique () ..

Utilizzando l'algoritmo di forza bruta

// [1] Questo è il nostro array con elementi duplicati

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

// [2] Contenitore per il nuovo array senza elementi duplicati

$ arr = [];

// [3] ottiene la lunghezza dell'array duplicato e lo imposta sulla variabile da utilizzare per il ciclo

$ len = count ($ corrispondenze);

// [4] Se corrisponde all'array key ($ i) Current Loop Iteration non è disponibile in // [4] l'array $ arr quindi invia il valore chiave di iterazione corrente delle corrispondenze [$ i] // [4] all'array arr.

for ($ 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 )


-2

L'ho fatto senza usare alcuna funzione.

$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>";
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.