通过CSV搜索PHP会错过每行的第一个字符

时间:2015-03-18 17:14:52

标签: php csv

我有一个大约有一百行的.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;
?>

1 个答案:

答案 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)