我有一个大约有一百行的.csv,每行看起来像这样:
lastname, firstname, role, ...
我正在使用下面提供的脚本搜索.csv
,该工作正常。
唯一的问题是它只返回来自姓氏的第二个字符的匹配项。所以,如果我键入一些firstname -> match, role -> match, astname -> match, lastname -> no match
。显然每行的第一个字符都被忽略了,但我不知道为什么。 PHP也没有显示ä,ö,ü字符,但在.csv
中找到它们。
<?php
//returns an array containing each line as value of another array
$csv = array_map('str_getcsv', file('data.csv'));
//get the search parameter from URL
$q=$_GET["q"];
if(strlen($q) > 0) {
$hint="";
foreach($csv as $line){
//if the line contains the search string, append it to the resulting string
if(strpos($line[0], $q, 0) != FALSE) {
$hint = $hint."<p>".$line[0]."</p>";
}
}
}
// Set output to "no suggestion" if no hint was found
// or to the correct values
if ($hint == "") {
$response = "no suggestions";
} else {
$response = $hint;
}
//output the response
echo $response;
?>
答案 0 :(得分:2)
解决方案: PHP宽松比较和strpos
零指数问题
使用!==
if(strpos($line[0], $q, 0) !== FALSE) {
$hint = $hint."<p>".$line[0]."</p>";
}
PHP strpos
使用从零开始的字符串索引,因此它实际上匹配位置0
处的 lastname 并返回该值,该值被松散地解释为FALSE
。但是,使用严格的类型比较(例如===
和!==
)会限制条件语句以查找 type (本例中为boolean)和值的匹配。
在编程的旧时代(当使用打字机时)我使用了这个黑客:strpos("_".$string, $match)
。