2016-07-22 5 views
0

Я работаю с PHP, у меня есть структура JSon, которая выглядит следующим образом:Как искать эту структуру json?

{ 
    "events": [ 
    { 
    "timestamp": 1468774519, 
    "id": 75964, 
    }, 
    { 
    "timestamp": 1468771410, 
    "id": 24891, 
    }, 

    // etc 

Мне нужно принести 5 событий в ряде, но, начиная с одного конкретного идентификатора, поэтому моя первая идея заключается в петлю каждое событие с самого начала и проверить, является ли id смещением, которое я ищу, а затем, когда я его получу, я могу закодировать следующие 5 событий.

Но есть ли лучший способ сделать это? Возможно, он может пройти через сотни событий, так что, может быть, есть лучший способ добраться туда? спасибо

+0

какой язык/инструмент вы используете для разбора json? – ggrr

+0

хорошо, что это не простой способ сделать это отдельно от цикла, если вы не переделаете свои данные для хранения в базе данных, поместите на них индексы; или вы разделяете свои данные, чтобы иметь другую глубину для хранения каждого подмножества типа «146877» -> 1468770000-1468779999 ... или с помощью их «id» в качестве ключей – Anzel

+0

Извините - я использую php – tempse

ответ

0

Сначала я сделал бы ключ: value hash object (объект поиска), где ключ будет идентификатором вашей структуры, а значение будет ссылкой на событие. В результате вы перебираете структуру только один раз, а затем получаете все события из структуры поиска, просто обращаясь к ним по их ключам.

Вы также можете отсортировать его (в идеале, вы можете получить его уже отсортированным по id из вашего источника данных), а затем использовать алгоритм бинарного поиска.

0

Поскольку id не указаны в цифровом порядке, вы не можете использовать двоичный поиск, поэтому вам необходимо использовать последовательный поиск. Вот пример в JavaScript. Также обратите внимание, что этот код предполагает, что идентификатор присутствует, и по крайней мере еще четыре события после него в массиве.

var index = 0; 
var id = 12345; // for example 
var json = {...}; // whatever that object was 
while(json.events[index].id!=id) { 
    index++; 
} 

// found the one, do something with the next five 
for(var i=0; i<5; i++) { 
    var event = json.events[index+i]; 
    // do something 
} 
0

На мой взгляд, вы можете взять только одну петлю на события с фильтром event.id >= theId, а затем проверить, если отфильтрованный массив содержит theId. если вы его получите, вы можете отсортировать этот меньший массив и принять 5 событий.