2011-10-30 7 views
12

Tengo una matriz con 2 tipos de claves, cadenas y enteros. Quiero hacer foreach() en esta matriz y quiero hacerlo solo para las teclas numéricas. ¿Cuál es la forma más elegante de hacerlo?teclas numéricas de destino solo en la matriz

+2

Honestamente que haría uso de un bucle en su lugar. – BoltClock

+7

¿Obtuviste esta matriz a través de 'mysql_fetch_array' por casualidad? Si es así, puede decirle que solo devuelva una matriz numérica. –

+0

tendrá que iterar toda la matriz y comprobar si la clave no es numérica simplemente no hacer nada y continuar. – Ehtesham

Respuesta

22

Aquí hay un método complicado que usa array_filter() para devolver las teclas numéricas y luego iterar sobre ellas.

// $input_array is your original array with numeric and string keys 
// array_filter() returns an array of the numeric keys 
// Use an anonymous function if logic beyond a simple built-in filtering function is needed 
$numerickeys = array_filter(array_keys($input_array), function($k) {return is_int($k);}); 

// But in this simple case where the filter function is a plain 
// built-in function requiring one argument, it can be passed as a string: 
// Really, this is all that's needed: 
$numerickeys = array_filter(array_keys($input_array), 'is_int'); 

foreach ($numerickeys as $key) { 
    // do something with $input_array[$key'] 
} 

Es mucho más fácil sin embargo sólo forEach sobre todas las cosas:

foreach ($input_array as $key => $val) { 
    if (is_int($key)) { 
    // do stuff 
    } 
} 

Editar Misread post original y pensó que vi "numérico" claves "entero" en lugar de. Se actualizó para usar is_int() en lugar de is_numeric().

+0

La función anónima en 'array_filter' podría reemplazarse por la cadena' 'is_int'' :) –

+0

@Jack Gracias por descubrir una antigua respuesta. Respuesta expandida. –

+0

¿Pero cuán eficiente crees que podría ser esto? Muchas veces peor que 'foreach (*) {if (is_int) (do stuff;)}' ¿O casi lo mismo? De acuerdo con la descripción de la función, tendría que decir que esto es al menos 2 veces más intensivo en el procesador, y eso ni siquiera tiene en cuenta la creación de una variable completamente nueva. – Jonathon

10
foreach($array as $key => $val) { 
     if(!is_int($key)) 
      continue; 
     // rest of the logic 
    } 
+0

Semánticamente, 'is_int()' es diferente de 'is_numeric()'. –

+0

sí, es diferente pero OP dice enteros. – Ehtesham

+0

Cierto, lo hacen (y es posible que 'int' sea lo que querían decir en la práctica). Sin embargo, 'numérico' se usa varias veces, incluido el título de la pregunta. –

0

Al utilizar array_filter debe saber si tiene un valor tan similar como FALSE.

Esta es mi solución:

function filterArrayKeyInteger(Array $array) { 
    $integer = array_filter($array, function ($key) { 
     if ($key === 0 || is_int($key)) { 
      return true; 
     } 
    }, ARRAY_FILTER_USE_KEY); 
    return array_intersect_key($array, $integer); 
} 

$a = [0, false, 'aa','bb', 'cc', 'dd' => 'dd', '9.9' => 9.9];  
$b = filterArrayKeyInteger($a); 

Resultado de vardump

var_dump(a): array(7) { 
    [0]=> 
    int(0) 
    [1]=> 
    bool(false) 
    [2]=> 
    string(2) "aa" 
    [3]=> 
    string(2) "bb" 
    [4]=> 
    string(2) "cc" 
    ["dd"]=> 
    string(2) "dd" 
    ["9.9"]=> 
    float(9.9) 
} 

var_dump(b): array(5) { 
    [0]=> 
    int(0) 
    [1]=> 
    bool(false) 
    [2]=> 
    string(2) "aa" 
    [3]=> 
    string(2) "bb" 
    [4]=> 
    string(2) "cc" 
} 
Cuestiones relacionadas