2011-01-03 14 views
11

Tengo una configuración de matriz multidimensional como la siguiente:¿Cómo se puede hacer que una matriz multidimensional sea única?

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" 
) 
) 

¿Cuál sería la mejor manera de buscar a través de la zona para valores duplicados en "nombre" y eliminarlos, de manera que cada valor de la multidimensional array es único?

¡Gracias de antemano!

+0

Digamos que tiene un 'nombre' duplicado, pero el valor 'slug' varía, ¿qué anticipan el resultado? (¿Qué duplicado debe eliminarse/eliminarse?) –

+0

@Brad Christie, en este caso particular el nombre/slug no variará. ¡Gracias por tu comentario! :) – hsatterwhite

Respuesta

8

Como todo el mundo dada alternativas, he aquí una solución al problema a mano. A veces tenemos que trabajar con la información que tenemos, no reorganizarla de la manera que nos gusta. Dicho esto, esto eliminará todas las entradas subsiguientes de la matriz que sean duplicadas.

$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); 

que se verá así:

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

Gracias por la solución Brad! Me gusta tu punto de vista para resolver el problema y esto funciona para mí.Aunque voy a tomar la sugerencia de @Gobs de buscar en una tabla hash, ya que nunca lo hice. Buena oportunidad para aprender :) – hsatterwhite

+0

Hey probar este bebé de una sola línea: 'de entrada $ = array_map ('unserialize', array_unique (array_map ('serialize', $ entrada)));' https://stackoverflow.com/a/946300/3063226 – Heitor

0

Simplemente mirando su caso particular, recomendaría usar una tabla hash en lugar de una matriz bidimensional. Si usa su "nombre" como la clave en el hash, cada entrada sería única.

¿Existe una necesidad específica para la matriz multidimensional?

+0

Nunca utilicé una tabla hash, pero sin duda la examinaré como me sugirió. No hay necesidad específica para la matriz multidimensional, es solo cómo preparé la información en ese momento. Gracias por su sugerencia y ayuda. :) – hsatterwhite

24

Puede usar una matriz asociativa.

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

Esto crea una matriz temporal, utilizando $v['name'] como la clave. Si ya hay un elemento con la misma clave, no se agrega a la matriz temporal.

puede convertir la matriz asociativa de nuevo a una serie secuencial, utilizando

$array = array_values($temp_array); 

código de ejemplo y de salida: http://codepad.org/zHfbtUrl

+1

Me gusta esto, es un medio bastante simple y compacto de hacer el trabajo. Gracias por su ayuda y proporcionando un enlace a un ejemplo de trabajo! :) – 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; 
} 

le puede dar la matriz aquí y dar un nombre de colon para hacer único.

En este código, tiene matriz multidimensonal, buscamos esa matriz, qué índice de columna para nosotros, estamos presionando los valores de esa columna. Y cuando tiene el mismo valor, no agrega la matriz de devolución.

Así que esta solución para array_unique para 1 coloumn.

+0

¿Podría explicar mejor lo que está sucediendo aquí? – Mike

0

Solución mucho más simple para su matriz multidimensional.

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

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

también puede usar 'array_map (" json_decode ", array_unique (array_map (" json_encode ", $ final)))' si está almacenando datos en la base de datos. – manish1706

Cuestiones relacionadas