2016-05-14 2 views
1

Ich lerne PHP, & gerade bin ich fest. Ich lese eine .txt-Datei im Skript. Der Inhalt der Datei sind wie folgt aus:Unerwartetes Verhalten beim Analysieren von Textdatei

joe:secret 
root:admin 

ich die Datei mit der file() Funktion leicht lesen kann, verwendet wird, die ein Array zurückgibt. I die Daten in einer eine Variable als:

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

Next I foreach Schleife verwenden, und dann explodieren I jeder Zeile und speichert seinen Inhalt in einer Variablen wieder. Dann überprüfe ich die Variable, aber hier bekomme ich ein Verhalten, das ich nicht verstehe.

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

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

Der obige Code gibt die erwartete Ausgabe. Warum das? Wenn ich dies tue,

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

dann bekomme ich korrekte Ausgabe. Also verstehe ich nicht warum mein Scheck fehlschlägt?

+0

Haben Sie gesagt, dass beide korrekte Ausgabe geben? – kojow7

+0

@ kojow7 Ja, ich habe verstanden, warum das passiert ist. Sie können die angenommene Antwort lesen :) –

Antwort

2

Dieser war schwierig; Ich beschuldige Sie nicht für das nicht :)

Also zuerst zu kontrollieren, lassen Sie sich mit dem php -a interaktiv Shell untersuchen:

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

Sehen Sie, wie der Schlusskurs in einer separaten Zeile ist? Das liegt daran, dass die \n am Ende jeder Zeile in jedem Array-Element in $data gehalten werden. So $row[1]nicht gleich "secret"; es entspricht "secret\n". Um dies zu beheben, alles, was wir brauchen, ist rtrim():

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

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

Nun, es funktioniert wie erwartet:

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 > 

Edit: Wir auch file_get_contents() statt file() nutzen könnten, so dass wir einfach die Datei Inhalt als String, und wandeln Sie es in ein Array selbst:

$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

das macht sesne :) danke für die schöne Erklärung. Der Code funktioniert jetzt. –

+0

Super, kein Problem, froh zu helfen! :) – Will