array_slice для ассоциативного массива - PullRequest
3 голосов
/ 03 апреля 2019

У меня есть массив с индексами в качестве отметок времени.Я пытался 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 будет иметь многоdata.

$myrange = range(0,1549460338);
$output = array_intersect(["1549440811" => 1, "1549448226" => 2, "1551108588" => 3 ] , $myrange );

Я избегаю зацикливания массива, поскольку в массиве много данных.Также у меня есть много временных отметок, чтобы проверить.Этот код представляет собой упрощенную логику большего кода с записями из базы данных, проиндексированными с отметками времени.

Есть ли другой способ получить нужные данные?

1 Ответ

1 голос
/ 03 апреля 2019

Простой цикл 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 с этим индексом.

...