当从函数返回数组时,In_array函数不能很好地工作


in_array function doesn't work well when returning an array from a function

我有一个函数,它打开一个远程文件,并使用cURL库获取其内容。然后函数返回一个包含文件内容的数组。

然后,当它使用in_array函数检查该特定值是否存在于数组中时,它总是显示该值不存在,即使它存在。

这是代码和远程文件的内容。

function getCountry($file) {
    $fop = curl_init($file);
    curl_setopt($fop, CURLOPT_HEADER, 0);
    curl_setopt($fop, CURLOPT_RETURNTRANSFER, 1);
    $result = curl_exec($fop);
    curl_close($fop);
    $fcontent = explode("'n", $result);
    return $fcontent;
}
$file = "http://localhost/countries.txt";
$countries = getCountry($file);
if (in_array('italy', $countries)) {
    echo "Exists";
} else {
    echo "Not exists";
}

在远程文件countries.txt的内容中,一行中的每个句子或单词是这样的:

spain
italy
norway
canada
france

正如我前面提到的,它总是显示该值不存在,即使它存在

我非常确定您在源文件中有稀疏的字符,例如回车符。在getCountry调用之后尝试这个:

foreach($countries as &$country) {
  echo "'$country' (".strlen($country).")<br>";
  $country = trim($country);
}

如果它给'italy'的strlen为6,并在此过程中解决问题,我不会感到惊讶。

正确的修复方法是在解析后立即清理内容:

$fcontent = array_map('trim', explode("'n", $result));

如果您不确定文件中是否会有CRLF,则可以使用preg_split()代替explode(),如下所示:

return preg_split('/'r?'n/', $result);

或者对每个结果应用trim():

return array_map('trim', explode("'n", $result));

后一种方法还将删除不总是合适的前后空格和制表符。