2011-01-03 4 views
11

Ho una configurazione array multidimensionale come la seguente:Come si può rendere un array multidimensionale unico?

array(
    [0]=> 
    array(
    ["name"]=> "Foo" 
    ["slug"]=> "Bar" 
) 
    [1]=> 
    array(
    ["name"]=> "Foo" 
    ["slug"]=> "Bar" 
) 
    [2]=> 
    array(
    ["name"]=> "Test 1" 
    ["slug"]=> "test-1" 
) 
    [3]=> 
    array(
    ["name"]=> "Test 2" 
    ["slug"]=> "test-2" 
) 
    [4]=> 
    array(
    ["name"]=> "Test 3" 
    ["slug"]=> "test-3" 
) 
) 

Quale sarebbe il modo migliore per la ricerca in zona per i valori duplicati in "nome" e rimuoverli, in modo che ogni valore nel multidimensionale l'array è unico?

Grazie in anticipo!

+0

Supponiamo di avere un 'nome duplicato 'ma il valore' slug' varia - cosa stai anticipando il risultato? (Quale duplicato dovrebbe essere rimosso/cancellato?) –

+0

@Brad Christie, in questo caso particolare la combinazione nome/slug non varierà. Grazie per il tuo commento! :) – hsatterwhite

risposta

8

dal momento che tutti dato alternative, ecco una soluzione al problema a portata di mano. A volte dobbiamo lavorare con i dati che abbiamo, non riordinarli nel modo in cui ci piace. Detto questo, questo rimuoverà tutte le voci successive dall'array che sono duplicati.

$array = Array(
    Array(
    'name' => 'Test 3', 
    'slug' => 'test-3' 
), 
    Array(
    'name' => 'Foo', 
    'slug' => 'Bar' 
), 
    Array(
    'name' => 'Foo', 
    'slug' => 'Bar' 
), 
    Array(
    'name' => 'Test 1', 
    'slug' => 'test-1' 
), 
    Array(
    'name' => 'Test 2', 
    'slug' => 'test-2' 
), 
    Array(
    'name' => 'Test 3', 
    'slug' => 'test-3' 
), 
); 
var_dump($array); 

for ($e = 0; $e < count($array); $e++) 
{ 
    $duplicate = null; 
    for ($ee = $e+1; $ee < count($array); $ee++) 
    { 
    if (strcmp($array[$ee]['name'],$array[$e]['name']) === 0) 
    { 
     $duplicate = $ee; 
     break; 
    } 
    } 
    if (!is_null($duplicate)) 
    array_splice($array,$duplicate,1); 
} 
var_dump($array); 

Quale sarà simile a questa:

array(6) { 
    [0]=> 
    array(2) { 
    ["name"]=> 
    string(6) "Test 3" 
    ["slug"]=> 
    string(6) "test-3" 
    } 
    [1]=> 
    array(2) { 
    ["name"]=> 
    string(3) "Foo" 
    ["slug"]=> 
    string(3) "Bar" 
    } 
    [2]=> 
    array(2) { 
    ["name"]=> 
    string(3) "Foo" 
    ["slug"]=> 
    string(3) "Bar" 
    } 
    [3]=> 
    array(2) { 
    ["name"]=> 
    string(6) "Test 1" 
    ["slug"]=> 
    string(6) "test-1" 
    } 
    [4]=> 
    array(2) { 
    ["name"]=> 
    string(6) "Test 2" 
    ["slug"]=> 
    string(6) "test-2" 
    } 
    [5]=> 
    array(2) { 
    ["name"]=> 
    string(6) "Test 3" 
    ["slug"]=> 
    string(6) "test-3" 
    } 
} 
array(4) { 
    [0]=> 
    array(2) { 
    ["name"]=> 
    string(6) "Test 3" 
    ["slug"]=> 
    string(6) "test-3" 
    } 
    [1]=> 
    array(2) { 
    ["name"]=> 
    string(3) "Foo" 
    ["slug"]=> 
    string(3) "Bar" 
    } 
    [2]=> 
    array(2) { 
    ["name"]=> 
    string(6) "Test 1" 
    ["slug"]=> 
    string(6) "test-1" 
    } 
    [3]=> 
    array(2) { 
    ["name"]=> 
    string(6) "Test 2" 
    ["slug"]=> 
    string(6) "test-2" 
    } 
} 
+1

Grazie per la soluzione Brad! Mi piace il tuo punto di vista sul prendersi cura del problema a portata di mano e questo funziona per me.Anche se ho intenzione di prendere il suggerimento di @Gobs di guardare in un tavolo hash, dal momento che non l'ho mai fatto. Buona occasione per imparare. :) – hsatterwhite

+0

Ehi prova questo bambino con una fodera: '$ input = array_map ('unserialize', array_unique (array_map ('serialize', $ input)))' https://stackoverflow.com/a/946300/3063226 – Heitor

0

Solo guardando il tuo caso particolare, ti consiglio di utilizzare una tabella hash invece di una matrice bidimensionale. Se usi il tuo "nome" come chiave nell'hash, ogni voce sarebbe unica.

Esiste una necessità specifica per l'array multidimensionale?

+0

Non ho mai usato una tabella hash, ma cercherò sicuramente di farlo come suggerivi. Nessuna necessità specifica per l'array multidimensionale, è solo come ho preparato i dati in quel momento. Grazie per il tuo suggerimento e aiuto. :) – hsatterwhite

24

È possibile utilizzare un array associativo.

$temp_array = array(); 
foreach ($array as &$v) { 
    if (!isset($temp_array[$v['name']])) 
     $temp_array[$v['name']] =& $v; 
} 

Questo crea un array temporaneo, utilizzando $v['name'] come chiave. Se esiste già un elemento con la stessa chiave, non viene aggiunto all'array temporaneo.

è possibile convertire l'array associativo di nuovo a un array sequenziale, utilizzando

$array = array_values($temp_array); 

codice e l'output Esempio: http://codepad.org/zHfbtUrl

+1

Mi piace, è un mezzo abbastanza semplice e compatto per fare il lavoro. Grazie per il tuo aiuto e fornendo un link per un esempio di lavoro! :) – hsatterwhite

5
$array = array(
    0 => array(
     "name"=> "Foo", 
     "slug"=> "Bar" 
    ), 
    1 => array(
     "name"=> "Foo", 
     "slug"=> "Bar" 
    ), 
    2 => array(
     "name"=> "Test 1", 
     "slug"=> "test-1" 
    ), 
    3 => array(
     "name"=> "Test 2", 
     "slug"=> "test-2" 
    ), 
    4 => array(
     "name"=> "Test 3", 
     "slug"=> "test-3" 
    ) 
); 



function array_unique_by_key (&$array, $key) { 
    $tmp = array(); 
    $result = array(); 
    foreach ($array as $value) { 
     if (!in_array($value[$key], $tmp)) { 
      array_push($tmp, $value[$key]); 
      array_push($result, $value); 
     } 
    } 
    return $array = $result; 
} 

array_unique_by_key($array, "name"); 
0
function multi_array_unique_by_value($array, $colon = '') 
{ 
    $ret_array = array(); 
    $has_array = array(); 
    foreach($array as $item) 
    { 
     $item_array = (array)$item; 
     if(!in_array($item_array[$colon], $has_array)) 
     { 
      array_push($ret_array, $item); 
      array_push($has_array, $item_array[$colon]); 
     } 
    } 
    return $ret_array; 
} 

si può dare l'array qui e dare un nome i due punti per fare unica.

Su questo codice, si dispone di un array multidimensionale, si foreach quella matrice, quale indice di colonna per noi, spingiamo quei valori di colonna. E quando ha lo stesso valore, non aggiunge l'array di restituzione.

Quindi questa soluzione per array_unique per 1 colonna.

+0

Potrebbe spiegare meglio cosa sta succedendo qui? – Mike

0

Soluzione molto più semplice per il tuo array multidimensionale.

$unique = array_map('unserialize', array_unique(array_map('serialize', $array))); 

echo "<pre>"; 
print_r($unique); 
+0

puoi anche usare 'array_map (" json_decode ", array_unique (array_map (" json_encode ", $ final)))' se stai memorizzando i dati nel database. – manish1706