Reputation: 1010
I have an array with 2 kinds of keys, strings and integers. I want to do foreach()
on this array and want to do it for numeric keys only. What is the most elegant way of doing it?
Upvotes: 20
Views: 18172
Reputation: 698
This one-liner returns a new array with the values and its numeric keys:
$new_array = array_filter($my_array, 'is_int', ARRAY_FILTER_USE_KEY);
so if we have this:
array(
'fruit' => 'banana'
1 => 'papaya'
)
..we get this:
array(
1 => 'papaya'
)
Upvotes: 6
Reputation: 41
Using array_filter you must aware if you have value that similar as FALSE.
This is my solution:
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);
Result of 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"
}
Upvotes: 1
Reputation: 270687
Here's a complicated method using array_filter()
to return the numeric keys then iterate over them.
// $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']
}
It's much easier though to just foreach over everything:
foreach ($input_array as $key => $val) {
if (is_int($key)) {
// do stuff
}
}
Edit Misread original post and thought I saw "numeric" rather than "integer" keys. Updated to use is_int()
rather than is_numeric()
.
Upvotes: 30
Reputation: 2985
foreach($array as $key => $val) {
if(!is_int($key))
continue;
// rest of the logic
}
Upvotes: 11