提问人:Mehravish Temkar 提问时间:4/3/2019 最后编辑:Mehravish Temkar 更新时间:4/3/2019 访问量:1254
关联数组的array_slice
array_slice for associative array
问:
我有一个以索引作为时间戳的数组。
我试图获取时间范围内的所有值,但似乎不起作用。array_slice
$data = array_slice(["1549440811" => 1, "1549448226" => 2, "1551108588" => 3 ], 0, 1549460338);
我应该得到 as,但它不是那样工作的。$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赞
dWinder
4/3/2019
#1
简单的 for 循环应该做到:
$arr = ["1549440811" => 1, "1549448226" => 2, "1551108588" => 3 ];
$range = "1549460338";
foreach($arr as $k => $v) {
if ($range > $k)
break;
$newArr[$k] = $v;
}
您还可以使用 (doc):array_filter
$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
评论
0赞
Mehravish Temkar
4/3/2019
我不喜欢循环,因为数据太多了。
0赞
dWinder
4/3/2019
@MehravishTemkar更新帖子 - 更好吗?array_filter
0赞
Mehravish Temkar
4/3/2019
谢谢。让我在我的代码中实现它并回复您
2赞
Danyal Sandeelo
4/3/2019
@MehravishTemkar在后端,它将是循环
0赞
Mehravish Temkar
4/3/2019
谢谢。数组中的数千条记录以及时间戳,避免了会减慢速度的事情。@DanyalSandeelo
评论