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.