2012-07-16 136 views
6

当我使用in_array()时,PHP总是返回false,并且它是否在数组中并不重要。例如:PHP in_array()总是返回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'; 
} 

返回“未找到”即使“测试”是阵列

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

返回“未找到”的值,因为它应该

为什么返回当它应该是真的时候是错误的?请给出任何建议。我实际使用的列表有超过10K的值,因此我在这里缩短了它。

+0

你在使用什么操作系统?在窗口中,行结尾实际上是两个字符:\ r \ n,因此将其分割为\ n会给出'text \ r','list \ r'和'example'。 – 2012-07-16 20:26:36

+0

你确定你有'\ n'而不是'\ r \ n'吗? – 2012-07-16 20:26:40

+0

你可以'var_dump($ list_arr);'并发布输出? – MrGlass 2012-07-16 20:32:40

回答

9

如果您正在使用这个精确的例子,并被编码在Windows PC上,这个问题来自于Windows会保留线使用的Feed的事实:

\r\n 

因此,当你各执\ n只有你在物品的末尾保留了一个隐形的\ r,并且它们不符合这个原因。

+0

我在linux上,但是那确实解决了这个问题 – 2012-07-16 20:29:00

+0

它可以在编辑器中配置,它不应该是记事本 – Esailija 2012-07-16 20:29:07

+0

我使用Notepad ++来编写我的php – 2012-07-16 20:30:14

8

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

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

用4秒钟打败我吧? – 2012-07-16 20:27:12

+0

正确,当你用“\ r”分开时,最终得到的是“text \ r”作为字符串 - 所以请尝试将它放在'in_array()'中以便查看。 – Ariel 2012-07-16 20:27:21

+0

@MathieuDumoulin:我是忍者:P – 2012-07-16 20:27:23

0

如前所述,Windows使用\ r \ n作为行尾字符。 Unix使用\ n和Mac使用\ r。为了使移植的代码,使用PHP_EOL不断爆炸的字符串:

$list_arr = explode(PHP_EOL, $list) 

这样的话,你肯定它总是正常工作。

+0

事实并非如此,因为Windows将EOL存储为\ r \ n,但如果你对Linux的PC上运行它,它会\ n只有:HTTP://ca3.php。净/手动/ EN/reserved.constants.php – 2012-07-16 20:32:06

+0

@MathieuDumoulin所提供的链接并没有说明。它只是说平台的“正确的行尾字符”。如果您在Unix平台上使用Windows终止的编辑器,我的解决方案将不起作用。 – 2012-07-16 20:36:23

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常量会给你一个更好的与平台无关的获取定义换行符值的方法。