2016-07-22 60 views
0

我與PHP的工作,我有一個JSON結構看起來像這樣:我應該如何搜索這個json結構?

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

    // etc 

我需要獲取連續5個事件,而是從一個特定的ID開始,所以我的第一個想法是循環每一個事件從一開始就檢查id是否是我正在尋找的偏移量,然後當我得到它時,我可以循環接下來的5個事件。

但是有沒有更好的方法來做到這一點?它可能會循環數百個事件,所以也許有更好的方法到達那裏?謝謝

+0

你使用哪種語言/工具來解析json? – ggrr

+0

那麼除了循環之外,這並不是一個簡單的方法,除非你重新編碼你的數據以存儲在數據庫中,把索引放在它們上面;或者你分割你的數據有另一個深度來保存每個子集,如「146877」 - > 1468770000-1468779999 ...等或使用他們的「ID」作爲鍵 – Anzel

+0

對不起 - 我使用php – tempse

回答

0

首先我會做一個關鍵:值哈希對象(查找對象),其中的關鍵將是你的結構中的id,並且該值將是對事件的引用。因此,只需遍歷結構一次,然後通過按鍵訪問它們即可從查找結構中獲取所有事件。

您可以對其進行排序(理想情況下,您可以根據數據源對其進行排序),然後使用二進制搜索算法。

0

由於id不是數字順序,因此不能使用二分查找,因此您需要使用順序查找。以下是JavaScript中的一個示例。還要注意,這段代碼假設id是存在的,並且在它之後至少有四個事件在數組中。

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個事件。