我有一个索引作为时间戳的数组。我尝试使用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 );
我避免循环遍历数组,因为数组有很多数据。我也有很多时间戳要检查。此代码是较大代码的简化逻辑,其中包含使用时间戳索引的数据库中的记录。
有没有其他方法可以获得所需的数据?
简单的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
与该索引。