2014-08-28 82 views
0

我在段落上做了一個preg_split的單詞數組。我試圖將這些字詞與存儲在每個用戶個人資料中的已保存「關鍵字」進行比較。因爲我對這些詞做了foreach,所以當多個人擁有相同的關鍵字時,我無法構建數組。在創建多維數組時創建的值將被跳過

數據庫包含以下內容。

id value 
------+-------- 
    8  frac 
    8  oil 
    8 trucks 
    9  mud 
    9  oil 
    9  tar 

下面是我使用的查詢。

$allwords = preg_split("/(?<=\w)\b\s*/", $sentence); 
$matches = array(); 
foreach ($allwords as $word) { 
    $result = db_query('SELECT n.id, n.value FROM {keywords} n WHERE n.value = :fkv', array('fkv' => $word)); 
    if($result->rowCount()) { 
    $usermatch = $result->fetchField(0); 
    $matches[$usermatch][] = $word; 
    } 
} 

我所得多維陣列將所述第一用戶而不是在第二個拾取oil。例如,我的一句話將包含oil mud trucks,但輸出會是這樣的:

array 
(
    [8] => array 
    (
     [0] => oil 
     [1] => trucks 
    ) 
    [9] => array 
    (
     [0] => mud 
    ) 
) 

應該有用戶9的條目會讀[1] => oil但它不會顯示出來。我覺得我的foreach是在錯誤的位置,或者我需要重置循環,但我無所適從。我如何讓用戶9也顯示oil

+0

您只是從查詢中獲取一行結果。你需要一個'while'循環來獲取結果的所有行。 – Barmar 2014-08-28 00:25:38

回答

0

您需要遍歷由查詢返回的所有行:

foreach ($allwords as $word) { 
    $result = db_query('SELECT n.id, n.value FROM {keywords} n WHERE n.value = :fkv', array('fkv' => $word)); 
    while ($usermatch = $result->fetchField(0)); 
     $matches[$usermatch][] = $word; 
    } 
} 

你並不需要測試rowCount()第一;如果查詢不匹配任何內容,循環將立即結束。

+0

看到它後有意義。這工作。 – Reveren 2014-08-28 00:54:07