【问题标题】:Grab array values with keys in specified range - PHP 5.5使用指定范围内的键获取数组值 - PHP 5.5
【发布时间】:2017-02-02 15:41:17
【问题描述】:

在任意顺序和键的数组中,如下

$myArray = array(
    1  => 'foo',
    4  => 'bar',
    6  => 'foobar',
    24 => 'barfoo',
    30 => 'fizz',
    35 => 'buzz',
    50 => 'fizzbuzz'
);

如何通过键范围获取数组的一部分,例如,每个项目的键在 5 到 40 之间

类似array_range($myArray, 5, 40);

预期输出:array(6 => 'foobar', 24 => 'barfoo', 30 => 'fizz', 35 => 'buzz')

这类似于How to use array_filter() to filter array keys?,但在这种情况下,我仅限于 PHP 5.5。

【问题讨论】:

  • 所有数组值是唯一的还是您希望重复?
  • 你可以 array_flip() 你的数组(交换键和值), array_filter() 翻转的数组,然后 array_flip() 返回结果。当然,对于不包含任何重复值的数组,这只会 100% 可靠地工作,但如果你能满足该要求,那么它应该可以工作。

标签: php arrays php-5.5


【解决方案1】:

在数组中定义一系列键,然后计算键的交集:

$range  = array_flip(range(5, 40));
$result = array_intersect_key($myArray, $range);

一个班轮:

$result = array_intersect_key($myArray, array_flip(range(5, 40)));

可选地填充范围数组(我只是先想到另一个,它更短):

$range = array_fill_keys(range(5, 40), 1);

如果你想要特定的键而不是范围,只需定义一个键或值的数组并翻转:

$range = array_flip(array(6, 24, 50));
//or
$range = array(6=>1, 24=>1, 50=>1);

【讨论】:

  • 这是最简洁的答案,但我一直遇到内存不足的问题:(
【解决方案2】:

如果 PHP 版本低于 5.6,升级您的 PHP 版本 - 5.5 is not even supported any longer。如果你不能升级 PHP,那么显然AbraCadaver's answer 是可以使用的。

这需要PHP 5.6+,但是在问题中澄清PHP版本之前已经回答了,所以我将其留作参考。

使用array_filter - 只要 PHP 版本高于 5.6:

$allowed_range = [ 'min' => 5, 'max' => 40 ];
$filtered = array_filter(
    $myArray,
    function ( $key ) use ( $allowed_ranged ) {
        return ( $key >= $allowed_range[ 'min' ] && $key <= $allowed_range[ 'max' ] );
    },
    ARRAY_FILTER_USE_KEY
);

【讨论】:

  • 我是开发者,不是系统管理员。当它在我的控制之下时,我只使用 PHP 7 作为绝对最低限度,但不幸的是事情并不总是这样。
  • 支持繁荣。任何使用过时 PHP 的人都应该立即更新。
  • 明白了——我把这个放在这里是为了将来的访问者和其他任何东西一样,所以不是对你或你的技能的任何评论!我也是一名开发人员,并且知道我们经常束手无策……
  • Google App Engine 卡在 5.5 上,因此如果您在 Google 的云中运行应用程序,那么您至少会卡在该版本上,直到 google 退出。
  • @GordonM - 哇,谷歌将人们锁定到不受支持的旧版本真是太神奇了:\
【解决方案3】:

只需迭代数组,并使用条件构建过滤数组(此处假设包含范围):

<?php
$in = array(
    1  => 'foo',
    4  => 'bar',
    6  => 'foobar',
    24 => 'barfoo',
    30 => 'fizz',
    35 => 'buzz',
    50 => 'fizzbuzz'
);

$out = [];
foreach($in as $k => $v)
{
    if($k >= 5 && $k <= 40) {
        $out[$k] = $v;
    }
}
var_dump($out);

输出:

array (size=4)
  6 => string 'foobar' (length=6)
  24 => string 'barfoo' (length=6)
  30 => string 'fizz' (length=4)
  35 => string 'buzz' (length=4)

【讨论】:

  • 正确且有效,但接受的答案要简洁得多。
  • 一目了然更明白,我给你。
  • 将其更改为正确答案,因为我必须使用它来保持更大范围的更大数组的内存限制。
猜你喜欢
  • 2020-09-20
  • 2015-10-24
  • 2023-04-06
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-31
相关资源
最近更新 更多