2011-10-30 14 views
12

Mam tablicę z 2 rodzajami kluczy, ciągów i liczb całkowitych. Chcę zrobić foreach() w tej tablicy i chcę to zrobić tylko dla kluczy numerycznych. Jaki jest najbardziej elegancki sposób na zrobienie tego?docelowe klucze numeryczne tylko w tablicy

+2

Szczerze chciałbym użyć pętli for zamiast. – BoltClock

+7

Czy macie tę tablicę przez 'mysql_fetch_array' przez przypadek? Jeśli tak, możesz powiedzieć, aby zwrócił tylko tablicę numeryczną. –

+0

będziesz musiał powtórzyć całą tablicę i sprawdzić, czy klucz nie jest numeryczny, po prostu nie rób nic i kontynuuj. – Ehtesham

Odpowiedz

22

Oto skomplikowana metoda z użyciem array_filter() w celu zwrócenia kluczy numerycznych, a następnie ich powtórzenia.

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

Jest dużo łatwiej, choć tylko foreach nad wszystkim:

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

Edit misread oryginalny post i że widzę "numeryczny" zamiast klawiszy "całkowitych". Zaktualizowano, aby używać is_int() zamiast is_numeric().

+0

Anonimową funkcję w 'array_filter' można zastąpić ciągiem' 'is_int'' :) –

+0

@Jack Dziękujemy za wykopanie starożytnej odpowiedzi. Odpowiedź rozszerzona. –

+0

Ale jak skuteczne wydaje ci się, że to możliwe? Wiele razy gorzej niż "foreach (*) {if (is_int) (do stuff;)}" Lub o tym samym? Opierając się na opisie funkcji, musiałbym powiedzieć, że jest to co najmniej 2 razy więcej procesora, a to nawet nie bierze pod uwagę utworzenia zupełnie nowej zmiennej. – Jonathon

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

Semantycznie, 'is_int()' różni się od 'is_numeric()'. –

+0

tak, różni się, ale OP mówi o liczbach całkowitych. – Ehtesham

+0

To prawda, że ​​tak (i ​​jest możliwe, że "int" jest tym, co mieli na myśli w praktyce). Jednak "numeric" jest używany kilka razy, w tym tytuł pytania. –

0

Używając array_filter musisz wiedzieć, czy masz wartość podobną do FALSE.

To jest moje rozwiązanie:

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

Wynik 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" 
} 
Powiązane problemy