【问题标题】:Remove all elements of an array with non-numeric keys使用非数字键删除数组的所有元素
【发布时间】:2012-06-18 01:02:21
【问题描述】:

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

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

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

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

我一直在考虑这个,但我想不出办法来做到这一点,因为array_filter没有为我的函数提供密钥,并且array_walk不能修改数组结构(在PHP手册中谈到)。

【问题讨论】:

  • 键是否是数字的字符串表示形式是否重要?即"0"
  • 最好,我想排除这种情况,只是因为它看起来更正确,但在我当前的应用程序中并不重要。
  • 做比必要的工作更多的工作永远不会“更正确”

标签: php arrays associative-array


【解决方案1】:

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

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

Demo.

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


从 PHP 7.4 开始,也可以使用短闭包::

array_filter($array, fn($k) => is_numeric($k), ARRAY_FILTER_USE_KEY);

【讨论】:

  • 您也可以将函数名作为字符串传递。 IE。 array_filter($array, "is_numeric", ARRAY_FILTER_USE_KEY);
【解决方案2】:

一个(长)中不用写循环就可以做到:

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

它的作用:

  • 由于array_filter 使用值,array_keys 首先创建一个以键作为值的新数组(忽略原始值)。
  • 这些然后由is_numeric 函数过滤。
  • 然后将结果翻转,因此键再次成为键。
  • 最后,array_intersect_key 仅从原始数组中获取在上述结果中具有键的项目(数字键)。

不过不要问我关于性能的问题。

【讨论】:

  • 如何检查数组键不是数字。我正在尝试在 array_filter 回调中使用 is_string 函数,但出现错误
  • 您遇到什么错误?正如您在此处看到的,这似乎可行:3v4l.org/aj9FD
  • 说实话,array_filter 实际上是一个循环。您不是在“编写”循环,而是在内部。
  • 如果您选择使用此答案,请记住,尽管array_intersect_key 带有is_numeric 过滤器,但您可以简单地使用is_string 过滤器。
【解决方案3】:

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

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

【讨论】:

  • PHP 新手在这里。我有一个二维数组,我用它来更新我的内部循环。我可以从打印语句中得知内部循环正在更新,但由于某种原因,整个二维数组保持不变。我不得不在最后添加另一行。所以如果外循环是foreach ($everything as $index => $arr),你需要$everything[$index] = $arr;
【解决方案4】:

这是一个循环:

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

【讨论】:

  • 因为 !intval(0) 为真。
猜你喜欢
  • 2019-08-21
  • 2020-08-29
  • 2017-10-27
  • 2020-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-12
  • 1970-01-01
相关资源
最近更新 更多