2011-10-30 14 views
12

Ho una matrice con 2 tipi di chiavi, stringhe e numeri interi. Voglio fare foreach() su questo array e voglio farlo solo per i tasti numerici. Qual è il modo più elegante per farlo?tasti numerici di destinazione solo nell'array

+2

Onestamente mi piacerebbe utilizzare un ciclo for, invece. – BoltClock

+7

Hai ottenuto questo array attraverso 'mysql_fetch_array' per caso? Se è così, puoi dire di restituire solo un array numerico. –

+0

si dovrà iterare l'intero array e verificare se la chiave non è numerica, non fare nulla e continuare. – Ehtesham

risposta

22

Ecco un metodo complicato utilizzando array_filter() per restituire i tasti numerici, quindi iterare su di essi.

// $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'] 
} 

E 'molto più facile anche se per foreach poco più di tutto:

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

Modifica Misread post originale e ho pensato che ho visto "numerico", piuttosto che i tasti "integer". Aggiornato per utilizzare is_int() anziché is_numeric().

+0

La funzione anonima in 'array_filter' potrebbe essere sostituita dalla stringa' 'is_int'' :) –

+0

@Jack Grazie per aver trovato una risposta antica. Risposta espansa. –

+0

Ma quanto pensi che pensi possa essere efficace? Molte volte peggio di 'foreach (*) {if (is_int) (do stuff;)}' O più o meno lo stesso? In base alla descrizione della funzione, dovrei dire che questo è almeno 2 volte più intensivo del processore, e che non sta nemmeno prendendo in considerazione la creazione di una variabile completamente nuova. – Jonathon

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

Semanticamente, 'is_int()' è diverso da 'is_numeric()'. –

+0

sì è diverso ma OP detto interi. – Ehtesham

+0

È vero, lo fanno (ed è possibile che 'int' sia ciò che intendevano in pratica). Tuttavia, 'numerico' è usato più volte, incluso il titolo della domanda. –

0

Utilizzando array_filter è necessario sapere se si dispone di un valore simile a FALSE.

Questa è la mia soluzione:

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); 

Risultato di 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" 
} 
Problemi correlati