【问题标题】:array_slice for associative array关联数组的array_slice
【发布时间】:2019-08-24 16:53:16
【问题描述】:

我有一个带有索引作为时间戳的数组。 我尝试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 );

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

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

【问题讨论】:

  • 为什么要过滤数组,为什么不过滤 mysql 查询或任何使用数据库的东西??
  • @nageennayak 我对从数据库获取的数据有一个循环,时间戳 1549460338 是循环中的一条记录,我避免在循环中查询数据库以获取其他数据。我在一个由时间戳索引的查询中获得了其他数据
  • @nageennayak 我正在获取的其他数据也被循环中的其他记录重用
  • 数组是否已经按时间戳排序?
  • @acd 是排序

标签: php arrays slice associative-array


【解决方案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);提取键,然后使用二分搜索(O(log(n)))搜索$range ) -> 然后将array_slice 与该索引一起使用。

【讨论】:

  • 我不想循环,因为数据太多了。
  • @MehravishTemkar 使用 array_filter 更新帖子 - 更好吗?
  • 谢谢。让我在我的代码中实现它并回复你
  • @MehravishTemkar 在后端,它将是循环
  • 谢谢。数组中的数千条记录以及时间戳,避免了会减慢速度的事情。 @DanyalSandeelo
猜你喜欢
  • 2013-10-10
  • 1970-01-01
  • 2013-07-17
  • 1970-01-01
  • 2015-12-11
  • 1970-01-01
  • 1970-01-01
  • 2021-11-10
  • 2019-09-21
相关资源
最近更新 更多