2012-02-01 5 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을 검색하는 경우처럼 Johnson의 모든 성이 목록에 표시됩니다.

내가 겪고있는 문제는 검색 결과가 일치하지 않아 검색 결과가 이름 목록에 없다는 것을 알 때 나타나지 않습니다. 그래서 나는 smith john이 결과를 리턴해야한다는 것을 알게 될 것이지만, 결과는 돌아 오지 않을 것입니다.

검색 기능을 사용하여 실제로 작업 한 적이 처음이므로 제대로 처리하려고합니다.

답변

4

strpos() 함수는 아마도 0를 반환 할 수있는 의미, 일치하는 하위 문자열의 인덱스를 반환 : 문자열이 발견되지

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

경우 FALSE를 반환합니다. 0FALSE 모두 (둘 다 FALSE을 논리 값으로 평가 의미) falsy 값은

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

때문에 엄격한 검사를 사용해야합니다 :

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

주의 대신 strpos(...)strpos(...) !== FALSE.

(@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

이봐 최고! 그래서 이것은 그들이 거기에 있다는 것을 알 때 결과가 나타나지 않는 문제를 완화시킵니다. 다른 문제는 여전히 발생하고 있습니다. 나는 이름을 검색하고 쿼리에 가까운 것을 포함하지 않는 결과를 얻는다. –

+0

@ baudday : 나는 왜 그런 일을하는지 알려주는 검색 예제와 예제 데이터가 필요합니다. – FtDRbwLXw6

+0

좋아요,이 이름은 형식이 지정되었습니다. 마지막, 처음 중간 : Baier, Michael Joseph; 베이커, 마이클 다니엘; 베이커, 스테파니 니콜; 반 필드 크리스토퍼 필립; 은행, 조셉 앤드류; 이발사, David Daniel; 이제 해당 목록에서 Michael을 검색하십시오. 전체 목록을 반환해야합니다. 검색 코드를 별도의 코멘트에 게시합니다. –

관련 문제