4

我有以下 PHP 代码:

$haystack  = file("dictionary.txt");
$needle = 'john';
$flipped_haystack = array_flip($haystack);
if (isset($flipped_haystack[$needle])) {
    echo "Yes it's there!";
}
else {
    echo "No, it's not there!";
}

的内容dictionary.txt如下(UTF-8编码):

john

出于某种原因,尽管事实是$haystack打印出来没有任何问题,但我一直在弄错。这只是我不断得到的错误,这一直给我带来问题。或者,我尝试更改$haystack为以下代码,该代码又正确返回为 true:

$haystack = array("john");

为什么我的代码错误地返回 false?

4

4 回答 4

4

这可能是因为每个元素末尾的换行符。尝试这个:

$haystack  = file("dictionary.txt", FILE_IGNORE_NEW_LINES);

这是PHP 手册中的注释:

Each line in the resulting array will include the line ending, unless FILE_IGNORE_NEW_LINES is used, so you still need to use rtrim() if you do not want the line ending present.
于 2013-03-17T04:52:16.097 回答
2

问题取决于以下事实file

以数组形式返回文件。数组的每个元素对应于文件中的一行,换行符仍然附加。

因此john不等于john\n

只需设置以下标志:

file("dictionary.txt", FILE_IGNORE_NEW_LINES);
于 2013-03-17T04:54:57.430 回答
2

file()函数正在向数组元素添加换行符。

请参阅手册页:http ://www.php.net/manual/en/function.file.php

以这种方式打开文件:

$haystack = file('dictionary.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

此外,为了帮助调试,您可以添加如下行:

var_dump($haystack);

var_dump($flipped_haystack);

这会告诉你这个:

array(1) {
  [0] =>
  string(5) "john\n"
}
array(1) {
  'john
' =>
  int(0)
}
No, it's not there!
于 2013-03-17T04:57:28.057 回答
1
于 2013-03-17T04:56:32.670 回答