2010-03-14 19 views
32

Eventuali duplicati:
php multi-dimensional array remove duplicatephp ottenere valori unici di un array multidimensionale

Ho un array come questo:

$a = array ( 
    0 => array ('value' => 'America',), 
    1 => array ('value' => 'England',), 
    2 => array ('value' => 'Australia',), 
    3 => array ('value' => 'America',), 
    4 => array ('value' => 'England',), 
    5 => array ('value' => 'Canada',), 
) 

Come posso rimuovere i valori duplicati così ottengo questo:

$a = array ( 
    0 => array ('value' => 'America',), 
    1 => array ('value' => 'England',), 
    2 => array ('value' => 'Australia',), 
    4 => array ('value' => 'Canada',), 
) 

Ho provato a utilizzare array_unique, ma ciò non funziona perché questo array è multidimensionale, penso.

Edit: Ho anche bisogno che questo array sia multi-dimensionale e in questo formato non riesco ad appiattirlo.

+13

Ironia della sorte, molti duplicati: http://stackoverflow.com/search?q=php+array+duplicate –

+3

Sono tutti molto diverso? Mostrami su quali risposte la domanda di array multidimensionali. – Mark

+0

Ce ne sono molti, alcuni per array multidimensionali, alcuni per array monodimensionali. Quello che ho votato in particolare per chiudere era: http://stackoverflow.com/questions/1861682/php-multi-dimensional-array-remove-duplicate, che è quasi esattamente la stessa domanda (rimuovere elementi basati su un elemento secondario valore). Per favore, non prenderlo sul personale. Funziona meglio per SO se non ci sono centinaia di domande duplicate. –

risposta

85

array_unique è usando la conversione di stringhe prima di confrontare i valori per trovare i valori unici:

Nota: Due elementi sono considerati uguali se e solo se (string) $elem1 === (string) $elem2. In parole: quando la rappresentazione della stringa è la stessa. Verrà utilizzato il primo elemento.

Ma una schiera sempre convertire in Array:

var_dump("Array" === (string) array()); 

si può risolvere questo specificando il SORT_REGULAR modalità nel secondo parametro di array_unique:

$unique = array_unique($a, SORT_REGULAR); 

O, se che non funziona, da serializing gli array prima e unserializing dopo aver chiamato array_unique per trovare i valori unici:

$unique = array_map('unserialize', array_unique(array_map('serialize', $a))); 
+0

Ottima soluzione pure. Grazie. – Mark

+0

Ecco perché è necessario il flag SORT_REGULAR, per mantenere gli array dalla conversione alle stringhe. In teoria, almeno. – Sejanus

+0

@Sejanus: è quello che ho pensato anch'io. Ma sembra che non funzioni per Mark. Quindi ho proposto una soluzione alternativa. – Gumbo

1

Usa flag SORT_REGULAR.

$unique_array = array_unique($a, SORT_REGULAR); 

Non so perché sia ​​d'aiuto ma lo è. Almeno con PHP 5.3

+2

Da php docs: ** 'Nota:' ** 'Si noti che array_unique() non è destinato a lavorare su array multidimensionali. –

+0

Oh, sono a 5.2, non funziona per me. – Mark

+0

Probabilmente avrai bisogno di scrivere la tua funzione in quel caso. – Sejanus

10

Qui :)

<?php 
$a = array ( 
    0 => array ('value' => 'America',), 
    1 => array ('value' => 'England',), 
    2 => array ('value' => 'Australia',), 
    3 => array ('value' => 'America',), 
    4 => array ('value' => 'England',), 
    5 => array ('value' => 'Canada',), 
); 

$tmp = array(); 

foreach ($a as $row) 
    if (!in_array($row,$tmp)) array_push($tmp,$row); 

print_r ($tmp); 
?> 
+1

Secondo [php.net] (http: // php.net/array_push), è meglio usare '$ tmp [] = $ row' invece di' array_push ($ tmp, $ row) '. Altrimenti: bella risposta. – middus

+0

ah lol, hai ragione, ma ora sono un dubbio, perché dovrei usare array_push? : D ahah – Marcx

Problemi correlati