Tengo una matriz asociativa en la forma key => value
en que la clave es un valor numérico, sin embargo, no es un valor numérico secuencial. La clave es en realidad un número de identificación y el valor es un recuento. Esto está bien para la mayoría de los casos, sin embargo, quiero una función que obtenga el nombre legible por humanos de la matriz y lo use para la clave, sin cambiar el valor.
No vi una función que haga esto, pero supongo que necesito proporcionar la clave antigua y la clave nueva (las cuales tengo) y transformar la matriz. ¿Hay una manera eficiente de hacer esto?
php
arrays
associative-array
Thomas Owens
fuente
fuente
Respuestas:
fuente
La forma en que haría esto y preservaría el orden de la matriz es colocando las claves de la matriz en una matriz separada, encuentre y reemplace la clave en esa matriz y luego vuelva a combinarla con los valores.
Aquí hay una función que hace exactamente eso:
fuente
si su
array
se construye a partir de una consulta de base de datos, puede cambiar la clave directamente desde lamysql
declaración:en vez de
usa algo como:
fuente
La respuesta de KernelM es buena, pero para evitar el problema planteado por Greg en el comentario (claves en conflicto), usar una nueva matriz sería más seguro
fuente
Podría usar una segunda matriz asociativa que asigne nombres legibles por humanos a los id. Eso también proporcionaría una relación de Muchos a 1. Entonces haz algo como esto:
fuente
Si desea que la posición de la nueva clave de matriz sea la misma que la anterior, puede hacer esto:
fuente
Si su matriz es recursiva, puede usar esta función: pruebe estos datos:
Aquí está la función:
fuente
fuente
Me gusta la solución de KernelM, pero necesitaba algo que pudiera manejar posibles conflictos de clave (donde una nueva clave puede coincidir con una clave existente). Esto es lo que se me ocurrió:
Luego puede recorrer una matriz como esta:
fuente
Aquí hay una función auxiliar para lograr eso:
Basada en la respuesta de @KernelM .
Uso:
Volverá verdadero en cambio de nombre exitoso, de lo contrario falso .
fuente
Cosas fáciles:
esta función aceptará el objetivo $ hash y $ reemplazos también es un hash que contiene asociaciones newkey => oldkey .
Esta función preservará el orden original , pero podría ser problemático para matrices muy grandes (como los registros de más de 10k) con respecto al rendimiento y la memoria .
esta función alternativa haría lo mismo, con un rendimiento y uso de memoria mucho mejores , a costa de perder el pedido original (¡lo cual no debería ser un problema ya que es hashtable!)
fuente
este código ayudará a cambiar la clave antigua a una nueva
mostrar como
fuente
Comparación simple de referencia de ambas soluciones.
Solución 1 Copiar y eliminar (pedido perdido) https://stackoverflow.com/a/240676/1617857
Solución 2 Cambie el nombre de la clave https://stackoverflow.com/a/21299719/1617857
Resultados:
fuente
Puede usar esta función basada en array_walk:
Da:
fuente
esto funciona para renombrar la primera clave:
luego, print_r ($ a) renderiza una matriz en orden reparada:
esto funciona para renombrar una clave arbitraria:
print_r ($ a)
una función generalizada:
fuente
Si desea reemplazar varias teclas a la vez (preservar el orden):
Uso:
fuente
Hay una forma alternativa de cambiar la clave de un elemento de matriz cuando se trabaja con una matriz completa, sin cambiar el orden de la matriz. Es simplemente copiar la matriz en una nueva matriz.
Por ejemplo, estaba trabajando con una matriz mixta y multidimensional que contenía claves indexadas y asociativas, y quería reemplazar las claves enteras con sus valores, sin romper el orden.
Lo hice cambiando la clave / valor para todas las entradas de matriz numérica, aquí: ['0' => 'foo']. Tenga en cuenta que el pedido está intacto.
Salida:
fuente
La mejor manera es usar referencia y no usar unset (lo que hace otro paso para limpiar la memoria)
solución:
Tiene una referencia original y otra con un nombre nuevo.
o si no quiere tener dos nombres en un valor es bueno, haga otra pestaña y consulte la referencia
La iteración es mejor en las claves que clonar toda la matriz y limpiar la matriz anterior si tiene datos largos como 100 filas +++, etc.
fuente
Hmm, no estoy probado antes, pero creo que este código funciona
fuente
Uno que ordena los conservantes que es fácil de entender:
fuente
Puede escribir una función simple que aplique la devolución de llamada a las teclas de la matriz dada. Similar a array_map
Aquí hay un resumen https://gist.github.com/vardius/650367e15abfb58bcd72ca47eff096ca#file-array_map_keys-php .
fuente
Esta función cambiará el nombre de una clave de matriz, manteniendo su posición, combinándola con la búsqueda de índice.
Uso:
fuente
Esta función básica maneja el intercambio de claves de matriz y mantiene la matriz en el orden original ...
Luego, puede recorrer e intercambiar todas las teclas 'a' con 'z', por ejemplo ...
fuente