2010-07-29 20 views
121

Tengo una matriz asociativa y necesito encontrar la posición numérica de una clave. Podría recorrer la matriz de forma manual para encontrarla, pero ¿hay alguna manera mejor de compilar en PHP?php - obtener el índice numérico de la matriz asociativa

$a = array(
    'blue' => 'nice', 
    'car' => 'fast', 
    'number' => 'none' 
); 

// echo (find numeric index of $a['car']); // output: 1 

Respuesta

201
echo array_search("car",array_keys($a)); 
+2

¿PHP garantiza el orden de una matriz asociativa? –

+4

@KevinBurke No va a reordenarlo a menos que use una función de clasificación. No estoy seguro de qué tipo de garantía está buscando, pero no es como el modelo de JavaScript donde no hay un orden estático para las matrices asociativas. – Fosco

+4

Los índices dados por "array_keys" no necesariamente coincidirán con el índice de la matriz original. Por ejemplo, si ha alterado la matriz mediante el uso de "unset" o una serie de otras funciones, habrá un espacio en el índice de la matriz original, pero array_keys generará una nueva matriz. – SEoF

0

una solución que subí ... probablemente bastante ineficiente en comparación Tho solución de Fosco:

protected function getFirstPosition(array$array, $content, $key = true) { 

    $index = 0; 
    if ($key) { 
    foreach ($array as $key => $value) { 
    if ($key == $content) { 
    return $index; 
    } 
    $index++; 
    } 
    } else { 
    foreach ($array as $key => $value) { 
    if ($value == $content) { 
    return $index; 
    } 
    $index++; 
    } 
    } 
} 
+2

Sí, PHP tiene miles de funciones integradas por una razón. Estos son * generalmente * mucho más rápidos que la lógica equivalente escrita a lo largo del código PHP. –

+3

Esto es probablemente más rápido que 'array_search', que primero hace un tipo y por lo tanto es muy lento. – Alasdair

+0

Ah, pero el código incorporado está precompilado, y la búsqueda probablemente será una búsqueda binaria (suponiendo que primero ordena los elementos). – SEoF

1

    $a = array(
     'blue' => 'nice', 
     'car' => 'fast', 
     'number' => 'none' 
); 
var_dump(array_search('car', array_keys($a))); 
var_dump(array_search('blue', array_keys($a))); 
var_dump(array_search('number', array_keys($a))); 
 
3
function arrayValuePosition($value, $array) 
{ 
    return array_search($value, array_keys($array)); 
} 
0

Si bien la respuesta de Fosco no es incorrecta, hay un caso que debe considerarse con este: matrices mixtas. Imagínese que tiene una matriz de esta manera:

$a = array(
    "nice", 
    "car" => "fast", 
    "none" 
); 

Ahora, PHP permite este tipo de sintaxis, pero tiene un problema: si me quedo código de Fosco consigo 0que está mal para mí, pero por qué sucede esto?
Debido al hacer comparaciones entre cadenas y números enteros PHP convierte cadenas en enteros (y esto es un poco estúpido en mi opinión), por lo que cuando array_search() búsquedas para el índice que se detenga en el primero, porque al parecer ("car" == 0)es cierto.
Establecer array_search() en modo estricto no resolverá el problema porque entonces array_search("0", array_keys($a)) devolverá falso incluso si existe un elemento con índice 0.
Así que mi solución justa convierte todos los índices de array_keys() de cuerdas y luego los compara correctamente:

echo array_search("car", array_map("strval", array_keys($a))); 

imprime 1 que es correcta

+0

Al pasar una variable, también debe lanzarla como una cadena, ya que pasar cero a una matriz asociativa tendría el mismo efecto negativo. Por ejemplo: 'var_dump (array_search (0, array_map (" strval ", array_keys ($ a))));' siempre generará 'int (0)', en lugar de 'bool (false)'. –

Cuestiones relacionadas