[PHP] Problem mit file() - Array

Gandalfx86

Lieutenant
Registriert
Apr. 2004
Beiträge
734
Ich stehe im Moment irgendwie auf dem Schlauch:

Ich versuche eine Datei zu erstellen, in der in jeder Zeile der Name eine weiteren Datei steht, sozusagen ein Verzeichnis für weitere Dateien. Mit file packe ich das in ein Array. Wenn ich allerdings ein Element des Arrays als Dateinamen weiterverwenden will, sagt der mir die Datei würde nicht existieren, obwohl sie eindeutig vorhanden ist, und auch alle nötigen Zugriffrechte eingestellt sind.

Zur Veranschaulichung:
PHP:
/*einmal das ganze von Hand */
$einStringArray = array( "datei1.txt", "datei2.txt", "datei3.txt");

/*und das normalerweise identische Array aus der Datei erstellt */
$Zeilen = file('verzeichnisdatei.txt');

if ( $einStringArray == $Zeilen)
echo "Arrays gleich<br>";
else
echo "Arrays nicht gleich<br>";

echo "<br>Array aus Datei:<br>";
foreach ($Zeilen as $key => $value)
echo $key."  ".$value."<br>";

echo "<br>selbsterstelltes Array:<br>";
foreach ($einStringArray as $key => $value)
echo $key."  ".$value."<br>";

echo "<br>Aufruf ueber selbsterstelltes Array: Dateiname :".$einStringArray[2]."<br>";
$Datei1 = file( $einStringArray[2] );

echo "<br>Aufruf ueber Array von file(): Dateiname :".$Zeilen[2]."<br>";
$Datei2 = file( $Zeilen[2] );

Die Ausgabe ist folgende:
Code:
Arrays nicht gleich

Array aus Datei:
0 datei1.txt
1 datei2.txt
2 datei3.txt

selbsterstelltes Array:
0 datei1.txt
1 datei2.txt
2 datei3.txt

Aufruf ueber selbsterstelltes Array: Dateiname :datei3.txt

Aufruf ueber Array von file(): Dateiname :datei3.txt

Warning: file(datei3.txt ) [function.file]: failed to open stream: No such file or directory in /var/www/phpdev/dateitest/dateitest.php on line 38

Line 38:
PHP:
$Datei2 = file( $Zeilen[2] );

Obwohl die Ausgabe gleich ist müssen sich die beiden Arrays also irgendwie unterscheiden. Die Frage ist, was ich machen muss, dass der die eingelesenen Dateinamen auch als solche akzeptiert.

Die verzeichnisdatei.txt sieht übrigends so aus:
Code:
datei1.txt
datei2.txt
datei3.txt
und ist ISO 8859-15 kodiert.
 
Die Funktion file() liest zwar die Datei ein und liefert den Inhalt als Array zurück, die Zeilen als solche bleiben jedoch unangetastet, d.h. jede/s Arrayelement/Zeile beinhalt am Ende den Zeilenumbruch. Wenn du die o.g. Datei einliest, hast du folgendes Array:
PHP:
$Zeilen = file('verzeichnis.txt');
echo '<pre>', var_export(file('a.txt'), true), '</pre>';
Ausgabe:
Code:
array (
  0 => 'datei1.txt
',
  1 => 'datei2.txt
',
  2 => 'datei3.txt
',
)

Du mußt also erst den Inhalt jedes Arrayelements mit rtrim() vom Zeilenumbruch befreien:
PHP:
foreach ($Zeilen as $Zeile)
  echo rtrim($Zeile, "\r\n");

Da literale Zeilenumbrüche in HTML als normale Whitespaces behandelt werden, siehst du solche Dinge nicht, wenn du die Ausgabe als HTML-Dokument im Browser betrachtest, daher solltest du generell solche Ausgaben (zu Debugging-Zwecken) als Text (Content-Type auf text/plain setzen) oder mittels des <pre>-Elements "formatiert" anzeigen lassen, um die tatsächlichen Stringinhalte zu sehen. Alternativ reicht natürlich auch ein Blick in den Quellcode der generierten HTML-Datei.

greetings, Keita
 
Zuletzt bearbeitet: (Der Content-Type muß natürlich text/plain und nicht text/html sein...)
Vielen Dank für die Hilfe.
Mit hinzufügen folgender Zeilen ist das Problem gelöst.
PHP:
foreach ($Zeilen as $key => $value)
$Zeilen[$key] = rtrim( $Zeilen[$key] );

Da hatte ich garnicht dran gedacht, dass da natürlich noch weitere, nicht angezeigte "Zeichen" für Tabulatoren, Umbrüche, ... in einer Textdatei stecken können.
 
Zurück
Oben