2010-10-14 11 views

risposta

12

è possibile utilizzare una combinazione di array_unique, array_diff_assoc e array_diff:

array_diff($arr, array_diff_assoc($arr, array_unique($arr))) 
+2

Che soluzione bizzarramente semplice. –

+1

Si noti che sebbene questa potrebbe essere una soluzione concisa, tutte le funzioni utilizzano Quicksort internamente che è in O (n²) nel peggiore dei casi (O (n · log n) in media). Quindi la complessità totale è in O (n²) anche nel caso peggiore. – Gumbo

4

È possibile utilizzare

$singleOccurences = array_keys(
    array_filter(
     array_count_values(
      array('banana', 'mango', 'banana', 'mango', 'apple') 
     ), 
     function($val) { 
      return $val === 1; 
     } 
    ) 
) 

Vedere

+0

ora che ha senso, tuttavia, mi piace di più ^^ – Hannes

+2

@Hannes I do not - questo è elegante :) – jensgram

-1

PHP.net http://php.net/manual/en/function.array-unique.php

array array_unique (array $array [, int $sort_flags = SORT_STRING ])

Accetta una matrice di input e restituisce una nuova matrice senza valori duplicati.


Nuova soluzione:


function remove_dupes(array $array){ 
    $ret_array = array(); 
    foreach($array as $key => $val){ 
     if(count(array_keys($val) > 1){ 
      continue; 
     } else { 
      $ret_array[$key] = $val; 
     } 
} 
+1

-1 leggi l'esempio nella domanda; 'array_unique' non funziona. – meagar

+1

Rimuove i duplicati, rendendo quindi l'array contenente solo valori univoci. OP, tuttavia, desidera che vengano rimosse * tutte * le istanze di qualsiasi valore duplicato, ovvero che conservino solo i valori rappresentati * esattamente * una volta. – jensgram

+0

Non capisco cosa intendi. dovrebbe funzionare. EDIT: oh, così. –

1

Se si desidera lasciare solo i valori nella matrice che sono già unico, piuttosto che selezionare un'istanza unica di ogni valore, si avrà effettivamente avere a rotolare il tuo. Funzionalità incorporate è solo lì per disinfettare i set di valori, piuttosto che filtrare.

1

Si desidera rimuovere le voci che presentano duplicati, in modo da lasciare solo le voci univoche nell'elenco? Hmm suona come qualcosa che dovrai fare da solo.

1

Nessuna funzione esistente; Dovrete farlo in due passaggi, uno per contare i valori unici e uno per estrarre i valori unici:

$count = array(); 
foreach ($values as $value) { 
    if (array_key_exists($value, $count)) 
    ++$count[$value]; 
    else 
    $count[$value] = 1; 
} 

$unique = array(); 
foreach ($count as $value => $count) { 
    if ($count == 1) 
    $unique[] = $value; 
} 
2

Basta scrivere il proprio semplice ciclo foreach:

$used = array();  
$array = array("banna","banna","mango","mango","apple"); 

foreach($array as $arrayKey => $arrayValue){ 
    if(isset($used[$arrayValue])){ 
     unset($array[$used[$arrayValue]]); 
     unset($array[$arrayKey]); 
    } 
    $used[$arrayValue] = $arrayKey; 
} 
var_dump($array); // array(1) { [4]=> string(5) "apple" } 

divertirsi:)

+1

Per qualche motivo non pensavo che potessi cambiare la dimensione di un array in quel modo durante un 'foreach', ma sembra funzionare. – meagar

+0

C'è qualche ragione per cui non hai dichiarato '$ used = array()' prima del ciclo 'foreach'? –

+1

@Kendall Hopkins non è necessario, ma hai ragione nello spirito dei buoni standard di programmazione lo aggiungerò :) – Hannes

0

La risposta in cima ha un bell'aspetto, ma su una nota a margine: se vuoi eliminare i duplicati ma lascia il primo, usare array_flip due volte sarebbe un modo abbastanza semplice per farlo.array_flip (array_flip (x))

+0

hai 'array_unique' per quello –

0

solo in parte relative a questa specifica domanda - ma ho creato questa funzione dalla risposta di Gumbo per gli array multidimensionali: stati

function get_default($array) 
{ 
    $default = array_column($array, 'default', 'id'); 
    $array = array_diff($default, array_diff_assoc($default, array_unique($default))); 

    return key($array); 
} 

In questo esempio, avevo memorizzati nella cache e ognuno a parte il valore predefinito era 0 (il valore predefinito era 1). Indico l'array default dagli ID e quindi lo trasformo in una stringa. Quindi, per essere chiari, il risultato restituito da questo è l'ID dello stato predefinito che fornisce la stessa parte dell'array multidimensionale e non la chiave di esso

Problemi correlati