使用非数字键删除数组的所有元素

时间:2012-06-14 23:04:06

标签: php associative-array

我有一个看起来像这样的数组:

Array
(
    [0] => apple
    ["b"] => banana
    [3] => cow
    ["wrench"] => duck
)

我想获取该数组并使用array_filter或类似的东西来删除带有非数字键的元素并接收以下数组:

Array
(
    [0] => apple
    [3] => cow
)

我正在考虑这个问题,我想不出办法这样做,因为array_filter没有为我的函数提供密钥,而array_walk也无法修改数组结构(在PHP手册中讨论过)。

4 个答案:

答案 0 :(得分:27)

在这种情况下,使用foreach循环是合适的:

foreach ($arr as $key => $value) {
    if (!is_int($key)) {
        unset($arr[$key]);
    }
}

答案 1 :(得分:22)

无需在一个(长)中编写循环即可完成:

$a = array_intersect_key($a, array_flip(array_filter(array_keys($a), 'is_numeric')));
  

它的作用:

     
      
  • 由于array_filter使用值,array_keys首先创建一个新数组,其中键为值(忽略原始值)。
  •   
  • 然后通过is_numeric函数对其进行过滤。
  •   
  • 结果然后翻转,这样键再次成为键。
  •   
  • 最后,array_intersect_key仅从原始数组中获取上述结果中的键(数字键)。
  •   

不要问我关于表现的事。

答案 2 :(得分:13)

从PHP 5.6开始,现在可以以紧凑的形式使用array_filter

array_filter($array, function ($k) { return is_numeric($k); }, ARRAY_FILTER_USE_KEY);

Demo.

这种方法比我的盒子上的for循环慢约20%(1.61s与1M次迭代的1.31s)。

答案 3 :(得分:6)

这是一个循环:

foreach($arr as $key => $value) {
    if($key !== 0 and !intval($key)) {
         unset($arr[$key]);
    }
}