Tengo una matriz asociativa y necesito encontrar la posición numérica de una clave. Podría recorrer la matriz manualmente para encontrarla, pero ¿hay una mejor manera de construir en PHP?
$a = array(
'blue' => 'nice',
'car' => 'fast',
'number' => 'none'
);
// echo (find numeric index of $a['car']); // output: 1
array("val1", "val2", "car" => "val3")
ya que producirá0
, lo que está mal ...http://php.net/manual/en/function.array-keys.php
fuente
fuente
fuente
Si bien la respuesta de Fosco no es incorrecta, hay un caso a considerar con esta: matrices mixtas. Imagina que tengo una matriz como esta:
Ahora, PHP permite este tipo de sintaxis, pero tiene un problema: si ejecuto el código de Fosco obtengo lo
0
que me parece incorrecto , pero ¿por qué sucede esto?Porque cuando se hacen comparaciones entre cadenas y enteros, PHP convierte las cadenas en enteros (y esto es un poco estúpido en mi opinión), entonces cuando
array_search()
busca el índice se detiene en el primero porque aparentemente("car" == 0)
es cierto .Establecer el
array_search()
modo estricto no resolverá el problema porque luegoarray_search("0", array_keys($a))
devolvería falso incluso si existe un elemento con índice 0.Entonces, mi solución solo convierte todos los índices de
array_keys()
a cadenas y luego los compara correctamente:Impresiones
1
, lo cual es correcto.EDITAR:
Como Shaun señaló en el comentario a continuación, lo mismo se aplica al valor del índice, si busca un índice int como este:
Siempre obtendrá
0
, lo cual es incorrecto, por lo que la solución sería convertir el índice (si usa una variable) en una cadena como esta:fuente
var_dump(array_search(0, array_map("strval", array_keys($a))));
siempre saldráint (0)
, en lugar debool (false)
.una solución que se me ocurrió ... probablemente bastante ineficiente en comparación con la solución de Fosco:
fuente
array_search
, lo que hace una especie primero y, por lo tanto, es muy lento.Todas las soluciones basadas en array_keys no funcionan para matrices mixtas. La solución es simple:
Desde php.net: si el tercer parámetro estricto se establece en TRUE, la función array_search () buscará elementos idénticos en el pajar. Esto significa que también realizará una comparación de tipo estricta de la aguja en el pajar, y los objetos deben ser la misma instancia.
fuente