我有一个索引为时间戳的数组。
我尝试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 );
由于数组中包含大量数据,因此我避免在数组中循环。另外,我还有很多时间戳需要检查。此代码是对更大代码的简化逻辑,其中更大的代码具有来自数据库的记录,并带有时间戳。
还有其他方法可以获取所需的数据吗?
答案 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_filter
(doc):
$filtered = array_filter( $arr,
function ($key) use ($range) {return $range > $key;},
ARRAY_FILTER_USE_KEY
);
示例:3v4l
编辑:
最快方式(考虑到数组已已排序)是使用$keys = array_keys($arr);
提取键,然后使用二进制搜索来搜索$range
(O(log(n))
)->然后将array_slice
与该索引一起使用。