¿Cómo puedo eliminar valores duplicados de una matriz multidimensional en PHP?
Matriz de ejemplo:
Array
(
[0] => Array
(
[0] => abc
[1] => def
)
[1] => Array
(
[0] => ghi
[1] => jkl
)
[2] => Array
(
[0] => mno
[1] => pql
)
[3] => Array
(
[0] => abc
[1] => def
)
[4] => Array
(
[0] => ghi
[1] => jkl
)
[5] => Array
(
[0] => mno
[1] => pql
)
)
serialize(array('a' => '1', 'b' => '1'))
es diferente deserialize(array('b' => '1', 'a' => '1'))
. Esta opción fallará para las matrices utilizadas comosets
o(hash)maps
.Desde 5.2.9 puede usar
array_unique()
si usa laSORT_REGULAR
bandera de esta manera:Esto hace que la función compare elementos para la igualdad como si
$a == $b
se estuvieran utilizando, lo cual es perfecto para su caso.Salida
Sin embargo, tenga en cuenta que la documentación dice:
fuente
Tuve un problema similar pero encontré una solución 100% funcional.
fuente
De otra manera. Conservará las llaves también.
fuente
Los comentarios de los usuarios sobre la documentación de array_unique () tienen muchas soluciones para esto. Aqui esta uno de ellos:
Esto es de http://ca3.php.net/manual/en/function.array-unique.php#57202 .
fuente
Si "eliminar duplicados" significa "eliminar duplicados, pero deje uno allí", una solución podría ser aplicar
array_unique(...)
primero en la "columna de identificación" y luego eliminar en la matriz original todas las claves que se han eliminado de la matriz de columnas :El resultado es:
fuente
Esto eliminará los nombres duplicados de la matriz. único por clave
fuente
$array
las teclas comiencen en "0". Es posible que$array
las teclas comiencen en otro número si$array
es el resultado de una manipulación previa de la matriz. Usearray_values
para restablecer las teclas de nuevo a "0"Solución simple:
fuente
Simplemente use la opción SORT_REGULAR como segundo parámetro.
fuente
si necesita eliminar duplicados en claves específicas, como una identificación de mysqli, aquí hay una función simple
Puntos de bonificación Puede pasar una serie de claves y agregar un foreach externo, pero será 2 veces más lento por clave adicional.
fuente
Una forma muy fácil y lógica de crear una matriz multidimensional única es la siguiente:
Si tienes una matriz como esta:
utilizar
foreach
para resolver esto:te dará el siguiente resultado:
y si quieres reorganizar el orden de las teclas,
Esta operación le dará valores clave organizados como este:
Espero que esto aclare todo.
fuente
si tienes una matriz como esta:
(usuarios es el nombre de la matriz)
y quieres eliminar duplicados ... entonces:
puede ser una solución: P
fuente
Una solución fácil de leer, probablemente no la más eficiente:
fuente
Como la gente dice que
array_unique()
es muy lento, aquí hay un fragmento que uso para una matriz multidimensional de un nivel.Referencia del primer usuario contribuido nota de la página de
array_unique()
funciones en php.netfuente
$output = array_map('unserialize', array_keys($result));
Mucha gente me preguntó cómo hacer una matriz multidimensional única. He tomado referencia de tu comentario y me ayuda.
En primer lugar, gracias a @jeromegamez @daveilers por su solución. Pero cada vez que respondía, me preguntaban cómo funciona este 'serializar' y 'no serializar'. Es por eso que quiero compartir la razón de esto con usted para que ayude a más personas a comprender el concepto detrás de esto.
Estoy explicando por qué usamos 'serializar' y 'deserializar' en pasos:
Paso 1: Convierta la matriz multidimensional en una matriz unidimensional
Para convertir la matriz multidimensional en una matriz unidimensional, primero genere una representación de flujo de bytes de todos los elementos (incluidas las matrices anidadas) dentro de la matriz. La función serialize () puede generar una representación de flujo de bytes de un valor. Para generar una representación de flujo de bytes de todos los elementos, llame a la función serialize () dentro de la función array_map () como una función de devolución de llamada. El resultado será una matriz unidimensional sin importar cuántos niveles tenga la matriz multidimensional.
Paso 2: haga que los valores sean únicos
Para hacer que esta matriz unidimensional sea única, use la función array_unique ().
Paso 3: revertirlo a la matriz multidimensional
Aunque la matriz ahora es única, los valores parecen una representación de flujo de bytes. Para revertirlo a la matriz multidimensional, use la función unserialize ().
Gracias de nuevo por todo esto.
fuente
Una alternativa para serializar y única
* /
fuente
Si tienes una matriz como esta
y quieres obtener matrices como esta:
o
un siguiente código puede ayudar
fuente
He pensado mucho en este problema y he determinado que la solución óptima debe seguir dos reglas.
Con eso en mente y teniendo en cuenta todas las peculiaridades de PHP, a continuación se muestra la solución que se me ocurrió. A diferencia de algunas de las otras respuestas, tiene la capacidad de eliminar elementos en función de las claves que desee. Se espera que la matriz de entrada sean teclas numéricas.
El único inconveniente es que las teclas no están en orden cuando se completa la iteración. Esto no es un problema si posteriormente usa solo bucles foreach, pero si necesita usar un bucle for, puede colocar
$input = array_values($input);
después de lo anterior para volver a numerar las teclas.fuente
Basado en la respuesta marcada como correcta, agregando mi respuesta. Pequeño código agregado solo para restablecer los índices
fuente