2013-05-28 37 views
0

我正在爲我的網站構建一個搜索引擎。我有我的網站頁面中包含的所有單詞及其位置的索引。我使用PHP陣列和搜索後返回的信息是這樣的:如何相交多維數組

'jeff' => 
    array 
     1 => 
     array 
      0 => int 0 
      1 => int 259 
      2 => int 444 
      3 => int 461 
      4 => int 486 
'seka' 
    array 
     1 => 
     array 
      0 => int 1 
      1 => int 260 
      2 => int 445 
      3 => int 462 
      4 => int 487 

如果我想找到傑夫的所有帖子列表中,我將尋找「傑夫」作爲重點;如果它存在,那麼我將它插入一個變量,如$v=index['jeff']

這很簡單,但現在如果我有一個多字符串查詢,如「傑夫和塞卡」?我如何檢查它們是否存在並將它們作爲不同的數組返回(一個用於jeff,另一個用於seka),所以我可以輕鬆地將它們相交以找到具有兩個搜索字符串的文檔?

+1

一種快速方法是將所需的值返回到其他變量中。 – tuxnani

+0

如果querry字符串超過兩個字怎麼辦可以說五個字可以請您指定我將如何將結果轉換爲貴重物品? – user2075354

+0

如果我沒有錯,那些數字就是頁面的ID在哪裏找到的單詞。實際上,它們指向一組位置(int)。這個例子不是很容易理解,但我知道它:D –

回答

1

編輯:評論後重新編寫。有些反饋會很好,看看我們是否正朝着正確的方向前進!

你看過array_intersect_key()函數嗎?你應該能夠做到:

$common = array_intersect_key(index['jeff'], index['seka']); 

這將給你一個與傑夫和塞卡共同這些頁面的只是鍵(和值,從「傑夫」)一個新的數組。您可以爲該函數提供任意數量的附加數組,這將允許您一起搜索(例如)五個不同的術語,並僅檢索包含全部五個術語的頁面。

您的返回數組將包含每個頁面的鍵。每個鍵的值將來自array_intersect_key()調用中的第一個參數(在我的示例中爲「jeff」)。換句話說,返回index['jeff']數組的一個子集。

如果您想要檢索每個頁面上其他條款的位置,您可以在開始時用不同的術語重複搜索(不要:效率很低)或循環返回結果中的鍵(可以得到一個與$pages = array_keys($common);)的關鍵字數組,並將其作爲數組的索引用於其他每個術語。

+0

好吧,也許我的解釋不清楚,但我正在建立一個網站的搜索引擎,在這一點上,我已經建立了網站上的網頁上的所有單詞的索引。 jeff和seke的例子是從頁面中提取的單詞,編號數組是這些單詞被發現的頁面的ID,並且最後的數字值是該單詞在頁面中的位置。 – user2075354

+0

OP要求進行「AND」比較,因此交叉點已經提供了所需的信息(包含搜索中所有術語的頁面)。這樣,他可以提供這些頁面的鏈接列表,作爲用戶提交搜索的結果。爲了檢索其他術語的位置,我支持你只是循環遍歷數組中的鍵,然後檢索位置編號。 –

+0

@Erenor:我已經給出了一個「AND」結果,OP也希望Jeff和Seka的「不同陣列」作爲他的結果的一部分,我已經解決了這個問題(雖然我可能錯誤地猜出了想要的是什麼)。我完全同意你對他爲什麼需要所有搜索詞出現的頁面的評估(我之前遇到過「搜索引擎」這個詞)......你是在暗示我錯過了什麼嗎?如果是這樣,什麼? –