2012-01-01 19 views
11

Quindi questo è quello che mi dà fastidio.PHP - Come confrontare due array e rimuovere i valori duplicati

Ho due matrici:

$array1 = array('[param1]' ,'demo' ,'[param2]' ,'some' ,'[param3]'); 
$array2 = array('value1' ,'demo' ,'value2' ,'some' ,'value3'); 

Ora voglio mettere a confronto queste due serie di, e rimuovere tutti i valori duplicati.
Alla fine voglio questi due array ma senza 'demo' e 'alcuni' valori in essi.
Voglio rimuovere tutti i valori dagli array che hanno la stessa chiave e il medesimo valore.
Gli array avranno sempre lo stesso numero di valori e indici, voglio solo confrontarli e rimuovere le voci che hanno la stessa chiave e il medesimo valore, da entrambi.

che sto facendo qualcosa di simile ora:

$clean1 = array(); 
$clean2 = array();  

foreach($array1 as $key => $value) 
{ 
    if($value !== $array2[$key]) 
    { 
     $clean1[$key] = $value; 
     $clean2[$key] = $array2[$key]; 
    } 
} 

var_export($clean1); 
echo "<br />"; 
var_export($clean2); 

E questo funziona! Ma mi chiedo se ci sia un altro modo per farlo? Forse senza usare il ciclo foreach? C'è un modo più elegante per farlo?

+3

Puoi definire cosa è "elegante" per te? Non vedo problemi qui ... – nmagerko

+3

Questo richiederà sempre una ricerca lineare. A tale proposito, la tua soluzione è la più efficiente. – You

risposta

21
array_unique(array_merge($arr_1, $arr_2)); 

o si può fare:

$arr_1 = array_diff($arr_1, $arr_2); 
$arr_2 = array_diff($arr_2, $arr_1); 

immagino ...

+0

Grazie! Il secondo è "elegante"! Ma array_diff elimina le chiavi da arr_1 che non sono presenti in $ arr_2 e restituisce quell'array con chiavi che non sono in ordine.E questo può essere un problema per me :(Ho bisogno di un nuovo array che inizi da 0: S C'è un modo per reimpostare i tasti dell'array, se ho chiavi come 0, 3, 7, posso resettarle per essere 1,2, 3? Se no Il joust stick con il primo ciclo foreach – Limeni

+4

$ arr_1 = array_values ​​($ arr_1); dovrebbe funzionare –

+0

yup abbastanza bene per non iterare attraverso i loop pesanti di stupidi PHP xD –

4

È possibile utilizzare la funzione array_diff in PHP che tornerà e la matrice contenente le chiavi che sono gli stessi tra il due array.

$clean1 = array_diff($array1, $array2); 

http://php.net/manual/en/function.array-diff.php

+0

Grazie! Il secondo è "elegante"! Ma , array_diff disattiva le chiavi da arr_1 che non sono presenti in $ arr_2. E questo può essere un problema per me :(Ho bisogno di un nuovo array che inizi da 0: S C'è un modo per reimpostare le chiavi dell'array, se ho chiavi come 0 , 3, 7, posso resettarli per essere 1,2,3? – Limeni

0

Dal $array1 e $array2 sono sempre la stessa lunghezza, si potrebbe fare qualcosa di simile:

<?php 

    $array1 = array('[param1]' ,'demo' ,'[param2]' ,'some' ,'[param3]'); 
    $array2 = array('value1' ,'demo' ,'value2' ,'some' ,'value3'); 

    $map = array_combine($array1,$array2); 
    $map = array_filter($map ,function ($item) use (&$map) { 
     $keep_data = ($item != key($map)); 
     next($map); 
     return $keep_data; 
    }); 

    $clean1 = array_keys($map); 
    $clean2 = array_values($map); 

    var_export($clean1); 
    echo "<br />"; 
    var_export($clean2); 

?> 

E 'meglio? Decidete

+0

Whooh, per me questo è più complicato .Stavo stavo facendo overkill con ciclo foreach ma sembra che sia il modo migliore di farlo. almeno per me, per te questo potrebbe essere più chiaro Grazie per il commento! – Limeni

+1

Yup ... d'accordo ... e è anche 3 volte più lento :) – Dancrumb

0

e che dire?

$res = array_diff($array1, $array_intersect($array1, $array2)); 
$reindexed = array_combine(array_keys($res), array_values($res)); 

o semplicemente modo se le chiavi non sono necessari

array_values(array_diff($array1, $array_intersect($array1, $array2))); 
1
$clean1 = array_diff($array1, $array2); 
$clean2 = array_diff($array2, $array1); 
$final_output = array_merge($clean1, $clean2); 
+1

Per favore aggiungi qualche spiegazione in modo che le persone possano imparare perché questo funziona – jou

0

La soluzione è sicuramente il più "elegante" (che significa il più facile da leggere, e minor quantità di codice), ma qui è un'altra soluzione che utilizza array_diff_ukey(). Conserva le chiavi e le inserisce in ordine incrementale, come richiesto.

$array1 = ['[param1]' ,'demo' ,'[param2]' ,'some' ,'[param3]']; 
$array2 = ['value1' ,'demo' ,'value2' ,'some' ,'value3']; 

$clean1 = $array1; 

$clean2 = array_diff_ukey(
    $array2, 
    $array1, 
    // Need to have "&" so the values get set. 
    function($a, $b) use (&$clean1, $array1, $array2) { 

     // Use isset() just in case keys are not identical 
     // or arrays are not the same length. 
     if (isset($array2[$b]) && $array2[$b] === $array1[$b]) { 
      unset($clean1[$b]); 
     } 

     return strcmp($array2[$a], $array1[$b]); 

}); 

print_r($clean1); 
print_r($clean2); 

tornerà questo:

Array 
(
    [0] => [param1] 
    [2] => [param2] 
    [4] => [param3] 
) 
Array 
(
    [0] => value1 
    [2] => value2 
    [4] => value3 
) 

esempio here lavoro.

Problemi correlati