2012-12-13 22 views
22
$result = array(
    0=>array('a'=>1,'b'=>'Hello'), 
    1=>array('a'=>1,'b'=>'other'), 
    2=>array('a'=>1,'b'=>'other'), 
); 

Se si è duplicato rimosso, in modo che il risultato è il seguente:rimuovere gli elementi di array associativo duplicato in PHP

$result = array(
    0=>array('a'=>1,'b'=>'Hello'), 
    1=>array('a'=>1,'b'=>'other') 
); 

Potrebbe qualsiasi sapere per fare questo?

Grazie

+0

Che cosa lo rende duplicare 'a =' '& b = other' o semplicemente' b = other' ... – Baba

+0

'a' e' B' @ Grazie Bada – kn3l

+0

http://stackoverflow.com/questions/3767318/how-to-remove-duplicate-values-from-an-associative-array-based-on-a-specific-val –

risposta

16

Per prima cosa, non è possibile utilizzare pianura array_unique per questo problema perché array_unique tratta internamente gli elementi di matrice come stringhe, che è il motivo per cui "Impossibile convertire Array per String" avvisi appariranno quando si utilizza array_unique per questo .

Quindi provare questo:

$result = array(
    0=>array('a'=>1,'b'=>'Hello'), 
    1=>array('a'=>1,'b'=>'other'), 
    2=>array('a'=>1,'b'=>'other') 
); 

$unique = array_map("unserialize", array_unique(array_map("serialize", $result))); 

print_r($unique); 

Risultato:

Array 
(
    [0] => Array 
     (
      [a] => 1 
      [b] => Hello 
     ) 

    [1] => Array 
     (
      [a] => 1 
      [b] => other 
     ) 

) 

serializzazione è molto utile per questo tipo di problemi.

Se ritieni che sia troppo magia per voi, controlla questo blog post

function array_multi_unique($multiArray){ 

    $uniqueArray = array(); 

    foreach($multiArray as $subArray){ 

    if(!in_array($subArray, $uniqueArray)){ 
     $uniqueArray[] = $subArray; 
    } 
    } 
    return $uniqueArray; 
} 

$unique = array_multi_unique($result); 

print_r($unique); 

Ironia della sorte, in_array sta lavorando per gli array, dove array_unique non lo fa.

+3

Beh, in realtà 'array_unique' è bene. Vedi la mia risposta: http://stackoverflow.com/a/13860140/367456 – hakre

38

Indipendentemente da ciò che altri offrono qui, si sta cercando una funzione denominata array_uniqueDocs. La cosa importante qui è di impostare il secondo parametro per SORT_REGULAR e quindi il lavoro è facile:

array_unique($result, SORT_REGULAR); 

Il significato della bandiera SORT_REGULAR è:

Confronta articoli normalmente (non modificare i tipi)

E questo è quello che vuoi. Si vuole compare arraysDocs qui e non cambiare il loro tipo in stringa (che sarebbe stata l'impostazione predefinita se il parametro non è impostato).

array_unique fa un confronto rigoroso (=== in PHP), per array significa:

$a === $bTRUE se $ ae $ b hanno le stesse coppie chiave/valore nello stesso ordine e degli stessi tipi .

uscita (Demo):

Array 
(
    [0] => Array 
     (
      [a] => 1 
      [b] => Hello 
     ) 

    [1] => Array 
     (
      [a] => 1 
      [b] => other 
     ) 
) 
+0

cool, non sapevo che un secondo parametro è disponibile al.l –

+1

@ DavidMüller: Il manuale vale sempre una visita;) Almeno è così che lo faccio se diventa specifico. Non è possibile conoscere ciascuna funzione in-e-out. – hakre

Problemi correlati