2010-03-14 70 views
32

Duplicar posibles:
php multi-dimensional array remove duplicatephp obtener valores únicos de una matriz multidimensional

Tengo una matriz de esta manera:

$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',), 
) 

¿Cómo puedo eliminar los valores duplicados para que yo obtenga esto:

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

Intenté usar array_unique, pero eso no funciona debido a que esta matriz es multidimensional, creo.

Editar: También necesito que esta matriz sea multidimensional y en este formato, no puedo aplanarla.

+13

Irónicamente, varios duplicados: http://stackoverflow.com/search?q=php+array+duplicate –

+3

Son todos muy diferentes? Muéstrame cuál responde la pregunta de las matrices multidimensionales. – Mark

+0

Hay muchas, algunas para matrices multidimensionales, otras para matrices de dimensiones únicas. El que específicamente voté para cerrar fue: http://stackoverflow.com/questions/1861682/php-multi-dimensional-array-remove-duplicate, que es casi exactamente la misma pregunta (eliminar elementos basados ​​en un subelemento valor). Por favor, no lo tomes como algo personal. Funciona mejor para SO si no hay cientos de preguntas duplicadas. –

Respuesta

85

array_unique es el uso de conversión de cadenas antes de comparar los valores para encontrar los valores únicos:

Nota: Dos elementos son considerados iguales si y solo si (string) $elem1 === (string) $elem2. En palabras: cuando la representación de cadena es la misma. El primer elemento será utilizado.

Pero una matriz siempre se convertirá en Array:

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

Puede resolver esto especificando la SORT_REGULAR modo en el segundo parámetro de array_unique:

$unique = array_unique($a, SORT_REGULAR); 

O, si eso no funciona, por serializing las matrices antes y unserializing después de llamar al array_unique para encontrar los valores únicos:

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

Gran solución también. Gracias. – Mark

+0

Es por eso que necesita el indicador SORT_REGULAR, para mantener las matrices de la conversión a cadenas. En teoría, al menos. – Sejanus

+0

@Sejanus: Eso es lo que yo también pensé. Pero parece que no funciona para Mark. Entonces, propuse una solución alternativa. – Gumbo

1

Usa la bandera SORT_REGULAR.

$unique_array = array_unique($a, SORT_REGULAR); 

No estoy seguro de por qué ayuda, pero lo hace. Al menos con php 5.3

+2

De los documentos php: ** 'Nota:' ** 'Tenga en cuenta que array_unique() no está destinado a trabajar en matrices multidimensionales. –

+0

Oh, estoy en 5.2, no funciona para mí. – Mark

+0

Bueno, probablemente necesite escribir su propia función en ese caso. – Sejanus

10

Aquí :)

<?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

Según [php.net] (http: // php.net/array_push), es mejor usar '$ tmp [] = $ row' en lugar de' array_push ($ tmp, $ row) '. De lo contrario: buena respuesta. – middus

+0

ah lol, tienes razón, pero ahora estoy en duda, ¿por qué debería usar array_push? : D ahah – Marcx

Cuestiones relacionadas