2012-07-16 182 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常量會給你一個更好的與平臺無關的獲取定義換行符值的方法。