PHP中的in_array()函数总是返回false。

7

当我使用in_array()函数时,PHP总是返回false,而它是否在数组中并不重要。例如:

$list = 'test
list
example';
$list_arr = array();
$list_arr = explode("\n",$list);
if (in_array('test',$list_arr)) {
    echo 'Found';
}
else {
    echo 'Not Found';
}

尽管'test'是数组中的一个值,但返回的结果却是“未找到”。
$list = 'test
list
example';
$list_arr = array();
$list_arr = explode("\n",$list);
if (in_array('qwerty',$list_arr)) {
    echo 'Found';
}
else {
    echo 'Not Found';
}

按照应有的结果,返回“未找到”

为什么它返回false而不是true?请提出任何建议。我实际使用的列表有10K多个值,因此我在这里只简化了它。


你使用的是哪个操作系统?在Windows中,换行符实际上是两个字符:\r\n,因此在\n上分割它将给你'text\r'、'list\r'和'example'。 - Bart Friederichs
СйауА«т«џСйаТюЅСИђСИф\nУђїСИЇТў»\r\nтљЌ№╝Ъ - Jeremy Holovacs
你能执行 var_dump($list_arr); 并发布输出结果吗? - MrGlass
4个回答

11

如果您正在使用此完全相同的示例并在Windows PC上编码,则问题出在Windows使用以下方式存储换行符:

\r\n

因此,当你只在 \n 上分割时,你会保留一个隐形的 \r 在你的元素末尾,因此它们不能匹配。


我正在使用Linux,但这确实解决了问题。 - Ethan H
它可以在编辑器中进行配置,不应该使用记事本。 - Esailija
我也使用Windows编写代码,但它只是在Linux服务器上运行。这可能是原因吗? - Ethan H
1
我有点困惑,你不是说你在使用Linux吗?如果你使用Notepad ++,请将其配置为将新行保存为'\n'(UNIX)。请参阅https://dev59.com/j2sy5IYBdhLWcg3w9i1u - Esailija
正如Esailija所说,如果您想在Linux上使用PHP_EOL,则文件的源代码必须以Linux格式编码。但是,如果您的服务器运行在Windows上,请确保您的NotePad++已配置为Windows样式的换行符。 - Mathieu Dumoulin
显示剩余4条评论

8

您的列表实际上是由\r\n分隔的,而不仅仅是\n

$list_arr = explode("\r\n",$list);

你比我快了多少...4秒钟? - Mathieu Dumoulin
当你按“\r”进行分离时,字符串会以“text\r”的形式结束 - 尝试将其放入in_array()中查看。 - Ariel
@MathieuDumoulin:我是一个忍者 :P - gen_Eric
不,你是火箭,速度更快! - Mathieu Dumoulin
@MathieuDumoulin:火箭忍者。 - gen_Eric
在Windows中,PHP_EOL是否定义为"\r\n"? - Puggan Se

1

这是一种相当奇怪的将值放入列表的方式。因此,我假设您最终想要将来自单独文件的行放入数组中。在这种情况下,您只需执行以下操作:

file('path/to/file');

将每一行读入一个单独的数组项。
引用的文件如下:
test
list
example

如果您已经知道了值,就像您的代码示例一样,那么您应该将它们放入数组中,而不是从字符串中读取。

如果您必须从字符串中读取值,我建议使用PHP_EOL常量来定义换行符。像这样:

$list = 'test' . PHP_EOL . 'list' . PHP_EOL . 'example';
$list_arr = explode(PHP_EOL, $list);

PHP_EOL常量将为您提供更好的跨平台方式来获取定义换行符的值。


1

如前所述,Windows使用\r\n作为行尾字符。Unix使用\n,而Mac使用\r。为了编写可移植的代码,请使用PHP_EOL常量来分解您的字符串:

$list_arr = explode(PHP_EOL, $list)

这样,您可以确保它始终正常工作。


不是真的,因为Windows会将EOL存储为\r\n,但如果在Linux PC上运行它,它只会是\n:http://ca3.php.net/manual/en/reserved.constants.php - Mathieu Dumoulin
@MathieuDumoulin,提供的链接并没有说明这一点。它只是针对平台指出了“正确的行尾字符”。如果您在Unix平台上使用Windows终止的编辑器,则我的解决方案将无法正常工作。 - Bart Friederichs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接