【问题标题】:How to extract array values with numeric keys only?如何仅使用数字键提取数组值?
【发布时间】:2015-12-13 21:59:03
【问题描述】:

考虑像这样的数组:

$arr = array(
  'key' => 'foo'
  'key2' => 'bar',
   0 => 'num_foo',
   1 => 'num_bar'

);

如何提取0&1以下的值? (除了使用 for 循环)。也许任何标准功能都可以完成这项工作?

【问题讨论】:

  • foreach 循环 is_int, is_numeric ...
  • 是的,所以打败我 :) 如果可以的话,我更喜欢内联而不是循环
  • 为什么不能用循环来做呢?这是学校作业吗?
  • 任何迭代数组的内部或用户编写的函数都将使用“循环”。你甚至知道你为什么不想要一个循环吗?
  • $out = array_filter($arr, function ($key) { return is_numeric($key); }, ARRAY_FILTER_USE_KEY);

标签: php arrays extraction


【解决方案1】:

如果您使用的是 >= 5.6 的 PHP 版本,则可以使用 array_filter,并带有指示它将密钥传递给回调函数的标志。

$arr = array(
  'key' => 'foo',
  'key2' => 'bar',
   0 => 'num_foo',
   1 => 'num_bar'
);

$new_array = array_filter($arr, function($key) {
  return is_numeric($key);
}, ARRAY_FILTER_USE_KEY);

var_dump($new_array);

https://3v4l.org/qfar9


编辑:正如 Robbie 指出的那样,在这里使用 is_numeric 是更好的选择。 (之前我的示例使用了is_int。)


编辑 2:也许is_int 实际上是这里更好的选择。 is_numeric 会为 +0123.45e6 或十六进制/二进制数字符号等值返回 true - 不确定是否需要。

is_int 通常会为 '1' 之类的值返回 false。它在这里工作,因为我们正在处理数组——如果数组键是“整数字符串”,PHP 会自动将它们转换为整数。

【讨论】:

  • @RobbieAverill:是的,你是对的。我会编辑的,谢谢。
  • @Robbie:也许is_int 是这里更好的选择,看我的编辑。
  • and w/ php >= v7.4 我们会做得更短array_filter($arr, fn($k) => is_int($k), ARRAY_FILTER_USE_KEY);
【解决方案2】:

你可以使用array_filter()返回数字键

// $Your_array is your original array with numeric and string keys
// array_filter() returns an array of the numeric keys
$numerickeys = array_filter(array_keys($Your_array), function($k) {return is_int($k);});

// this is a 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($Your_array), 'is_int');

【讨论】:

    【解决方案3】:

    如果您在foreach 循环中使用is_int(),那就很简单了。试试这个:

    foreach ($arr as $key => $value) {
        if (is_int($key)) {
            echo "Found integer key with value: $value\n";
        }
    }
    

    如果你非常想避免使用循环,试试这个:

    array_walk($arr, function($val, $key) {
        if (is_int($key)) {
            echo "Found integer key with value: $val\n";
        }
    });
    

    当然,无论如何,这确实在内部使用了一个循环。

    【讨论】:

    • 问题说“除了使用循环”
    • 他的评论是“我只是更喜欢内联”,这是一个奇怪的说法。不过我会更新我的答案。
    • 但在内部,我们有用 C 编写的循环(对吗?)而且我有很大的数组。
    • 这是一个显着的逻辑飞跃,而且绝对是过早的优化。使用 array_walk() 将为数组中的每个项目调用一次 PHP 函数。这比直接在 PHP 中循环更有效吗?如果是这样,我会感到惊讶。除非您的数组在规模上真的是 epic,否则请先尝试使用循环,并且仅在需要时进行优化。
    • 好点。使用内联的第二个原因是可读性提高。我认为有比 array_filter 等更好的方法,因为在这种情况下代码可读性更差 IMO。
    猜你喜欢
    • 1970-01-01
    • 2015-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多