2016-05-14 16 views
1

我正在學習PHP,&現在我卡住了。 我正在閱讀腳本中的.txt文件。該文件的內容是這樣的:分析文本文件時意外的行爲

joe:secret 
root:admin 

我可以很容易地使用file()函數,它返回一個陣列讀取該文件。我在一個變量中的數據存儲爲:

$data = file('location/file.txt'); 

接着我使用foreach循環,然後我爆炸的每一行,並再次存儲其在一個變量中的內容。然後我對變量進行檢查,但這是我得到的行爲,我不明白。

foreach ($data as $d) { 
    $row = explode(":", $d); 

    if ($row[0] == "joe" && $row[1] == "secret") { 
    echo "match found "; 
    } 
} 

上述代碼確實給出了預期的輸出。這是爲什麼?如果我這樣做,

echo $row[0]; echo $row[1]; 

然後我確實收到正確的輸出。所以我不明白爲什麼我的支票失敗了?

+0

你是否說,他們都給出正確的輸出? – kojow7

+0

@ kojow7是的,我知道爲什麼會發生這種情況。你可以閱讀接受的答案:) –

回答

2

這一個很棘手;我不怪你不:)

所以首先抓住這一點,讓我們與php -a交互shell調查:

php > $data = file('test.txt'); 
php > var_dump($data); 
array(3) { 
    [0]=> 
    string(11) "joe:secret 
" 
    [1]=> 
    string(11) "root:admin 
" 
    [2]=> 
    string(1) " 
" 
} 

見右引號是如何在單獨的行?這是因爲每行末尾的\n都保留在$data的每個數組元素中。所以$row[1]不是等於"secret";它等於"secret\n"。爲了解決這個問題,我們需要的是rtrim()

foreach ($data as $line) { 
    $line = rtrim($line); 
    $row = explode(":", $line); 

    if ($row[0] == "joe" && $row[1] == "secret") { 
    echo "Match found for joe!"; 
    } 
} 

現在,它按預期工作:

php > $data = file('test.txt'); 
php > foreach ($data as $line) { 
php { $line = rtrim($line); 
php { $row = explode(":", $line); 
php { 
php { if ($row[0] == "joe" && $row[1] == "secret") { 
php {  echo "Match found for joe!"; 
php { } 
php { } 
Match found for joe! 
php > 

編輯:我們也可以使用file_get_contents()代替file(),所以我們剛剛得到的文件內容作爲一個字符串,並將其轉換爲一個數組我們自己:

$data = file_get_contents('test.txt'); 
foreach (explode("\n", $data) as $line) { 
    $row = explode(":", $line); 

    if ($row[0] == "joe" && $row[1] == "secret") { 
    echo "Match found for joe!"; 
    } 
} 
+1

這使得sesne :)謝謝你的可愛的解釋。代碼現在可用。 –

+0

真棒,沒問題,樂於幫忙! :) – Will