好的,我有一个可以解析和显示的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
应该返回一个结果,但它会返回没有结果。
这是我第一次真正开发具有搜索功能的东西,所以我想做得对。
答案 0 :(得分:4)
strpos()函数返回匹配子字符串的索引,这意味着它可能会返回0
:
strpos('foo', 'f'); // 0
如果找不到子字符串,它将返回FALSE
。
strpos('foo', 'z'); // FALSE
由于0
和FALSE
都是 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.