无法搜索字符串

时间:2012-02-01 20:02:40

标签: php

好的,我有一个可以解析和显示的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应该返回一个结果,但它会返回没有结果。

这是我第一次真正开发具有搜索功能的东西,所以我想做得对。

1 个答案:

答案 0 :(得分:4)

strpos()函数返回匹配子字符串的索引,这意味着它可能会返回0

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

如果找不到子字符串,它将返回FALSE

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

由于0FALSE都是 falsy 值(意味着它们都评估为布尔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.