2009-12-03 34 views
0

我需要實現以下功能:交換空間中找到的字符串php

我有一個名稱字段,其中包含名稱和姓氏。這存儲在數據庫中,並按照'姓氏名'的順序。

我正在執行一個腳本來搜索這些記錄。目前,我設法檢查一個字符串是否包含一個空格,如果它包含一個空格,則表示它是一個名字,而不是一個ID卡號。下面是代碼:

$query = "John Doe"; 

$checkIfSpaceExists = strpos($query, " "); 

if ($checkIfSpaceExists == "") 
{ 
    //No Space therefore it is not a name 
} 
else 
{ 
    //Contains space 
    $queryExploded = explode(" ", $query); 
    foreach ($queryExploded as $q) 
    { 
     //Here I need the functionality so that if someone entered John Doe 
     //2 different strings are saved, which are 
     //$string1 = John Doe 
     //$string2 = Doe Johns 

     //If the name consists of 3 parts, strings for every combination is saved 
} 

然後我將插入SQL語句中的這些字符串與LIKE屬性會有一個像李四和DOE JOHN兩者。因此,如果用戶可以輸入John Doe或Doe John來查找結果。

有關如何做到這一點的任何建議?

非常感謝

克里斯

回答

1

怎麼樣使用這些爆炸3串中分離和融合式樣的約束?

喜歡的東西

"... WHERE name LIKE '%$name[0]%' AND name LIKE '%$name[1]%' AND name LIKE '%$name[2]%'" 

你可以建立此字符串foreach循環。

+0

,如果你想找到「喬納森·多伊」和「約翰·亨利·多伊」而定。它也不會在字符串的開頭使用帶有通配符的索引。 – nickf 2009-12-03 10:46:18

2

好的,從一開始 - 一定要仔細閱讀the manualstrpos並不完全符合您的想法。以下是你應該如何檢查一個空間:

if (strpos($query, ' ') === false) // the triple-equals is important! 

之後,這只是一個permutations and combinations的問題。這裏有一個堆棧溢出另一個答案這表明你如何做到這一點:algorithm that will take number or words and find all possible combinations

+0

如果我像你說的那樣使用它,腳本不能很好地工作。如果相反,我使用原來的,它運作良好。我將更新我的文章,因爲我成功實施了它。 – seedg 2009-12-03 12:40:06

+0

你能告訴我我使用它的方式有什麼問題嗎? 謝謝 – seedg 2009-12-03 12:49:18

+0

本手冊有一個以紅色突出顯示的部分,帶有一個非常大的警告標誌,其內容如下:'此函數可能返回布爾FALSE,但也可能返回非布爾值,其值爲FALSE,例如0或「」 。有關更多信息,請閱讀布爾部分。使用===運算符來測試此函數的返回值。' – nickf 2009-12-03 13:18:36

0
echo preg_replace('/^(\w+) (\w+)$/', '$2 $1', "John Doe"); 

Doe的約翰

+0

這不處理多個空格(3個或更多字) – nickf 2009-12-03 10:46:57

+0

preg_replace('/ ^(\ w +)(\ w +)(\ w +)$/','$ 3 $ 2 $ 1',「John Jay Doe」); preg_replace('/ ^(\ w +)(\ w +)(\ w +)$ /','$ 3 $ 1 $ 2',「Jay John Doe」); 快樂嗎? 3部分,多數民衆贊成他所要求的... – r3zn1k 2009-12-03 11:04:14

0

我想你不能這個領域分成名字和姓?我建議在數據庫中創建新的表格,標籤。標籤將是任何單詞 - 可能是姓氏,可能是名稱,可能是ID號碼...然後與record_id和tag_id建立連接record_tags。然後查詢將看起來像

SELECT record.* FROM record 
INNER JOIN record_tags rt1 ON rt1.record_id = record.id 
INNER JOIN tag t1 ON t1.id = rt1.tag_id 
INNER JOIN record_tags rt2 ON rt2.record_id = record.id 
INNER JOIN tag t2 ON t2.id = rt2.tag_id 
WHERE 
t1.name = "John" 
AND t2.name = "Doe" 

這將是更好的方法來搜索,因爲您可以然後使用任何數量的單詞/標籤。我認爲SQL可以更容易。多樣的方法是我認爲太多較慢,特別是隨着數據庫的增長。

+0

不,我不能拆分領域。數據庫每兩個月更新一次。它是一個非標準化的表,包含各種個人信息,例如名稱等......更新數據庫時,會創建一個包含所有信息的新表。以前的表格僅用於備份目的。前端程序(使用ExtJs實現)僅從最後創建的表中進行搜索。它忽略了所有其他的。有成千上萬的記錄,速度非常快...... – seedg 2009-12-03 12:52:02

0

隨着一些循環和字符串操作,我設法實現這個腳本。

這裏是我做過什麼:

我檢查,如果查詢包含使用strpos的空間。如果它包含一個空格,那麼它意味着它的名稱和姓氏,所以我輸入一個循環,以便輸出一個字符串'姓氏',另一個字符串'姓氏名字'

這是代碼:

$like = ""; //This is the LIKE sql command. 
    foreach ($selectedFields as $field) 
    { 
      $checkIfSpaceExists = strpos($query," "); 

    if ($checkIfSpaceExists != "") 
    { 
     $query1 = $query; //No space, so query1 is equal ta original query 

     $queryExploded = explode(" ", $query); 

     for ($i=0; $i<count($queryExploded); $i++) //First loop (name surname) 
     { 
      $tmp1 = $tmp1 . " " . $queryExploded[$i]; 
     } 

     for ($i=count($queryExploded); $i>=0; $i--) //Second loop (surname name) 
     { 
      $tmp2 = $tmp2 . " " . $queryExploded[$i]; 

     } 
     $query2 = $tmp2; 
     $query2 = trim($query2); 

     $like = $like . $field . " LIKE '%" . $query1 . "%' or " . $field . " LIKE '%" . $query2 . "%' or "; 

我希望這可以幫助別人需要:)其他