2009-12-03 7 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 
} 

는 다음 나는 LIKE 속성을 SQL 문에서 이러한 문자열을 삽입하고 JOHN DOE와 DOE JOHN 모두에게 LIKE있을 것입니다. 따라서 사용자가 결과를 찾기 위해 John Doe 또는 Doe John을 입력 할 수있는 경우.

어떻게해야합니까? 사용에 대한 이러한 별도의 3 문자열을 폭발 무엇

많은 감사

크리스

답변

1

LIKE-제약과는-결합?

뭔가

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

처럼 당신은 foreach 루프에서이 문자열을 만들 수있다.

+0

의존 필요 :)에서 다른 사람을 도움이되기를 바랍니다. 또한 문자열 시작 부분에 와일드 카드로 색인을 사용하지 않습니다. – nickf

2

처음부터 Ok- 신중하게 the manual을 읽으십시오. strpos은 자신이 생각하는대로 정확하게 수행하지 않습니다. 다음은 공간을 확인하는 방법입니다 : 그 후

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

+0

내가 사용하고있는 방식에 어떤 문제가 있는지 말해 줄 수 있습니까? – seedg

+0

설명서에 빨간색으로 강조 표시된 섹션이 있습니다.이 경고는 매우 큰 경고 기호와 함께 표시됩니다.'이 함수는 부울 FALSE를 반환 할 수 있지만 0 또는 ""과 같은 FALSE로 평가되는 부울이 아닌 값을 반환 할 수도 있습니다. . 자세한 내용은 부울에 대한 절을 읽으십시오. – nickf

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

미상 존

+0

이 연산자는 여러 공백 (3 개 이상 단어)을 처리하지 않습니다. – nickf

+0

preg_replace ('/^(\ w +) (\ w +) (\ w +) $/','$ 3 $ 2 $ 1 ','John Jay Doe '); preg_replace ('/^(\ w +) (\ w +) $ /', '$ 3 $ 1 $ 2', 'Jay John Doe'); 해피? 3 파트, 그가 요구 한 것이 전부 ... – r3zn1k

0

난 당신이 이름과 성으로이 분야를 분할 할 수없는 것 같아요? 데이터베이스에 새 테이블, 태그를 만드는 것이 좋습니다. 태그는 임의의 단어가 될 것입니다. 성 (surname) 일 수도 있고 이름 일 수도 있고 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

아니요 필드를 나눌 수 없습니다. 데이터베이스는 2 개월마다 업데이트됩니다. 이름과 같은 다양한 개인 정보가 포함 된 정규화되지 않은 테이블입니다. 데이터베이스가 업데이트되면 모든 정보가 포함 된 새 테이블이 만들어집니다. 이전 표는 백업 용도로만 사용되었습니다. 프론트 엔드 프로그램 (ExtJs로 구현)은 마지막으로 생성 된 테이블 만 검색합니다. 그것은 다른 모든 것을 무시합니다. 수천 개의 레코드가 있으며 엄청나게 빠릅니다 ... – seedg

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 "; 

나는 이것이 당신이 "Johnathon 미상"와 "존 헨리 미상"을 찾으려면

관련 문제