仅在数组中定位数字键

时间:2011-10-30 21:27:37

标签: php arrays

我有一个包含2种键,字符串和整数的数组。我想在这个数组上做foreach(),并且只想为数字键做。这样做最优雅的方式是什么?

4 个答案:

答案 0 :(得分:26)

这是一个复杂的方法,使用array_filter()返回数字键然后迭代它们。

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

虽然只是对所有事情进行预测,但要容易得多:

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

编辑误读原帖并认为我看到了“数字”而不是“整数”键。已更新为使用is_int()而不是is_numeric()

答案 1 :(得分:10)

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

答案 2 :(得分:3)

这种单行返回带有值及其数字键的新数组:

$new_array = array_filter($my_array, 'is_int', ARRAY_FILTER_USE_KEY);

所以,如果我们有这个:

array(
'fruit' => 'banana'
1 => 'papaya'
)

..我们得到了:

array(
1 => 'papaya'
)

答案 3 :(得分:1)

使用array_filter,您必须知道您是否具有与FALSE类似的值。

这是我的解决方案:

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

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"
}