2016-05-14 19 views
1

私はPHPを学んでいますが、今は&です。 私はスクリプト内の.txtファイルを読んでいます。ファイルの内容は、次のようにされていますテキストファイルの解析時に予期しない動作が発生する

joe:secret 
root:admin 

私は配列を返すfile()機能を使用して、簡単にファイルを読み込むことができます。 Iは、foreachループを使用

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

次に、その後、Iは各ラインを爆発し、再び変数にその内容を格納します。私は変数にデータを格納します。私は変数をチェックしますが、これは私が理解していない振る舞いを得る場所です。

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

この1つはトリッキーでした。私はこれをキャッチないためにあなたを責めることはありません:)

をだから、まずは、php -aインタラクティブシェルで調べてみましょう:

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()を使用することができますので、我々は単にファイルを取得します内容を文字列として変換し、配列に変換してください:

+1

これはsesneを作る:)素敵な説明に感謝します。コードは今動作します。 –

+0

驚くばかりですが、問題なく、喜んで助けてください! :) – Will

関連する問題