2012-02-01 90 views
1

好吧我有一個csv文件可以被解析和顯示。我想讓它可搜索。所以我有一個表單接受用戶查詢並將其與數組進行比較以查找匹配項。現在這是我有:查找字符串時遇到問題

foreach($last as $key=>$string) { 
    $hits[$key] = strpos(strtolower($string . " " . $first[$key] . " " . $middle[$key]), $query); 
} 

在這個小片段之前,我強迫$query還降低。

所以基本上這個連接完整名稱,Last First Middle,並搜索每個數組項目的匹配。那麼如果$hits[$key] != false我可以說那裏有一場比賽。所以我回過頭來顯示主要數組名稱的結果。希望這是有道理的...

現在在好的一面,我會得到很多結果應該顯示出來。就像我搜索jo一樣,列表中會出現所有約翰遜的姓氏。

我遇到的問題是找到的結果與查詢不匹配,或者結果沒有顯示出來,當我知道它們在名稱列表中時。所以我會知道smith john應該返回一個結果,但它會回來沒有結果。

這是我第一次真正在搜索功能的東西上工作,所以我想做正確的事情。

回答

4

strpos()函數返回匹配的子指數,這意味着它可能返回0

strpos('foo', 'f'); // 0 

如果沒有找到子串,它將返回FALSE

strpos('foo', 'z'); // FALSE 

因爲無論0FALSEfalsy值(這意味着他們都評價爲布爾FALSE),您將需要使用嚴格的檢查:

foreach($last as $key=>$string) { 
    $hits[$key] = strpos(strtolower($string . " " . $first[$key] . " " . $middle[$key]), $query) !== FALSE; 
} 

通知的strpos(...) !== FALSE,而不是僅僅strpos(...)

(用於@baudday)編輯:

代碼:

<?php 
$query = strtolower('Michael'); 

$last = array('Baier', 'Baker', 'Baker', 'Banfield', 'Banks', 'Barber'); 
$first = array('Michael', 'Michael', 'Stephanie', 'Christopher', 'Joseph', 'David'); 
$middle = array('Joseph', 'Daniel', 'Nicole', 'Phillip', 'Andrew', 'Daniel'); 

foreach ($last as $key=>$string) { 
    $haystack = $string . " " . $first[$key] . " " . $middle[$key] . " " . $first[$key] . " " . $middle[$key] . " " . $last[$key] . " " . $first[$key] . " " . $string . " " . $middle[$key]; 
    $hits[$key] = strpos(strtolower($haystack), $query) !== false; 
} 

foreach ($hits as $key => $matches) { 
    if ($matches) { 
     echo $last[$key] . ', ' . $first[$key] . ' ' . $middle[$key] . ' (key: ' . $key . ") matches the query.\n"; 
    } 
} 

輸出:

Baier, Michael Joseph (key: 0) matches the query. 
Baker, Michael Daniel (key: 1) matches the query. 
+0

嘿真棒!所以這減輕了我知道他們在那裏時不會顯示的結果的問題。另一個問題仍在發生。我搜索一個名字,我得到的結果甚至不包含任何甚至接近查詢的結果。 – 2012-02-02 15:33:34

+0

@baudday:我需要一個示例搜索術語以及您正在搜索的示例數據,以告訴您爲什麼要這樣做。 – FtDRbwLXw6 2012-02-02 15:38:31

+0

好吧試試格式化這些名字Last,First Middle:Baier,Michael Joseph;貝克,邁克爾丹尼爾;貝克,斯蒂芬妮妮可;班菲爾德克里斯托弗菲利普;銀行,約瑟夫安德魯;理髮師,大衛丹尼爾; 現在在該列表中搜索Michael。它應該返回整個列表。將在單獨的評論中發佈我的搜索代碼。 – 2012-02-02 16:20:23

相關問題