关联数组的array_slice

array_slice for associative array

提问人:Mehravish Temkar 提问时间:4/3/2019 最后编辑:Mehravish Temkar 更新时间:4/3/2019 访问量:1254

问:

我有一个以索引作为时间戳的数组。 我试图获取时间范围内的所有值,但似乎不起作用。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 );

我避免遍历数组,因为数组有很多数据。此外,我还有很多时间戳要检查。此代码是较大代码的简化逻辑,其中数据库中的记录使用时间戳编制索引。

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

PHP 关联数组

评论

0赞 Nageen 4/3/2019
为什么要过滤数组,为什么不过滤MySQL查询或任何使用你的数据库的东西??
0赞 Mehravish Temkar 4/3/2019
@nageennayak我对从数据库获取的数据有一个循环,并且1549460338的时间戳是循环中的记录,我避免在循环中查询数据库以获取其他数据。我在一个查询中得到了其他数据,而不是按时间戳索引
0赞 Mehravish Temkar 4/3/2019
@nageennayak,我正在获取的其他数据也被循环中的其他记录重用
0赞 ACD 4/3/2019
数组是否已按时间戳排序?
0赞 Mehravish Temkar 4/3/2019
@acd 是的,已排序

答:

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);$rangeO(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