2011-06-18 21 views
34

tengo una matriz como:PHP - Obtener valor de matriz con un índice numérico

$array = array('foo' => 'bar', 33 => 'bin', 'lorem' => 'ipsum'); 
echo native_function($array, 0); // bar 
echo native_function($array, 1); // bin 
echo native_function($array, 2); // ipsum 

Por lo tanto, esta función nativa devolvería un valor basado en un índice numérico (segunda arg), haciendo caso omiso de las teclas Assoc, buscando la posición real en la matriz.

¿Hay alguna función nativa para hacer eso en PHP o debería escribirlo? Gracias

+3

Esto suena como una mala idea. ¿Para qué necesitas esto? ¿No sería preferible tener teclas numéricas en este caso, y el valor 'foo' como miembro de una sub-matriz? –

+0

También creo que esto parece un mal diseño. ¿Puedes decirnos qué estás tratando de hacer? Tal vez hay una mejor solución. – Alp

Respuesta

11

array_values() va a hacer más o menos lo que quiere:

$numeric_indexed_array = array_values($your_array); 
// $numeric_indexed_array = array('bar', 'bin', 'ipsum'); 
print($numeric_indexed_array[0]); // bar 
+0

... y, a partir de PHP 5.4, aplástelo a: print (array_values ​​($ your_array) [0]); – Pancho

77
$array = array('foo' => 'bar', 33 => 'bin', 'lorem' => 'ipsum'); 
$array = array_values($array); 
echo $array[0]; //bar 
echo $array[1]; //bin 
echo $array[2]; //ipsum 
4

Sí, para valores escalares, una combinación de implode y array_slice hará:

$bar = implode(array_slice($array, 0, 1)); 
$bin = implode(array_slice($array, 1, 1)); 
$ipsum = implode(array_slice($array, 2, 1)); 

o mezclarlo con array_values y list (gracias @nikic) para que funcione con todos los tipos de valores:

list($bar) = array_values(array_slice($array, 0, 1)); 
+0

+1 Aunque hubiera utilizado 'list ($ bar) = array_slice ($ array, 0, 1)' para eliminar la limitación del valor escalar;) – NikiC

+0

@nikic: pensé en eso, lamentablemente, 'array_slice' conservará la cadena keys (incluso si * preserve_keys * es * false *), por lo que no puede usar 'list' en ese caso, a menos que' array_values' la matriz resultante. De todos modos, supongo que también es una solución, editada. Gracias. – netcoder

4

que propongo mi idea sobre ello en contra de cualquier desventaja array_values() función, porque creo que no es una función get directa. De esta manera tiene que crear una copia de los valores matriz numérica indexada y luego acceder. Si PHP no oculta un método que traduce automáticamente un entero en la posición del elemento deseado, tal vez una solución ligeramente mejor podría consistir en una función que ejecute la matriz con un contador hasta que conduzca a la posición deseada, luego devuelva el elemento alcanzado .

Por lo que el trabajo se optimizaría para una gran variedad de tamaños, ya que el algoritmo sería el mejor rendimiento de índices para pequeños, deteniéndose inmediatamente. En la solución resaltada de array_values(), sin embargo, tiene que ver con un ciclo que fluye a través de toda la matriz, incluso si, por ejemplo, tengo que acceder $ array [1].

function array_get_by_index($index, $array) { 

    $i=0; 
    foreach ($array as $value) { 
     if($i==$index) { 
      return $value; 
     } 
     $i++; 
    } 
    // may be $index exceedes size of $array. In this case NULL is returned. 
    return NULL; 
} 
+0

Pero, ¿qué pasa si 'falso' sería un valor extraído? Devolver 'null' sería aún malo pero mejor que' false'. – user619271

+0

Teniendo en cuenta la consistencia del tipo, obtendría el valor NULL o si el índice de entrada excede el tamaño de la matriz, o si el valor objetivo de la entrada de índice es NULL. En este caso, estoy de acuerdo contigo. Sin embargo, FALSO y NULO dan el mismo resultado en la función vacía(), que sería la siguiente verificación que se llevaría a cabo en cualquier escenario, tiene sentido llamar a esta función. –

Cuestiones relacionadas