用于关联数组的array_slice

时间:2019-04-03 08:25:34

标签: php arrays slice associative-array

我有一个索引为时间戳的数组。 我尝试array_slice来获取一个时间范围内的所有值,但似乎不起作用。

$data = array_slice(["1549440811" => 1, "1549448226" => 2, "1551108588" => 3 ], 0, 1549460338);

我应该将$data设为["1549440811" => 1, "1549448226" => 2],但那样行不通。

要获得正确的数据,我必须使用

$data = array_slice(["1549440811" => 1, "1549448226" => 2, "1551108588" => 3 ], 0, 2);

但是问题是记录可以有随机时间戳,没有。记录。因此,在这种情况下,我无法确定偏移量为2。

我知道下面的代码进行了一些更改可能适用于较小的范围,但不适用于我的时间戳,因为$myrange会有很多数据。

$myrange = range(0,1549460338);
$output = array_intersect(["1549440811" => 1, "1549448226" => 2, "1551108588" => 3 ] , $myrange );

由于数组中包含大量数据,因此我避免在数组中循环。另外,我还有很多时间戳需要检查。此代码是对更大代码的简化逻辑,其中更大的代码具有来自数据库的记录,并带有时间戳。

还有其他方法可以获取所需的数据吗?

1 个答案:

答案 0 :(得分:1)

简单的for循环应该这样做:

$arr = ["1549440811" => 1, "1549448226" => 2, "1551108588" => 3 ];
$range = "1549460338";
foreach($arr as $k => $v) {
    if ($range > $k)
        break;
    $newArr[$k] = $v;
}

您还可以使用array_filterdoc):

$filtered = array_filter( $arr,
    function ($key) use ($range) {return $range > $key;},
    ARRAY_FILTER_USE_KEY
);

示例:3v4l

编辑:

最快方式(考虑到数组已已排序)是使用$keys = array_keys($arr);提取键,然后使用二进制搜索来搜索$rangeO(log(n)))->然后将array_slice与该索引一起使用。