Wie kann ich feststellen, was eine Dateiressource Zeile ist zur Zeit „on“ in PHP?
Frage
Mit PHP ist es möglich, den Inhalt einer Datei mit fopen
und fgets
abzulesen. Jedes Mal, fgets
heißt, es gibt die nächste Zeile in der Datei.
Wie fgets
weiß welche Zeile zu lesen? Mit anderen Worten, wie weiß es, dass es zuletzt gelesene Zeile 5, so sollte es den Inhalt der Zeile 6 dieses Mal zurückkehren? Gibt es eine Möglichkeit für mich, um Zugang dass Zeilennummer Daten?
(Ich weiß, es möglich ist, etwas ähnliches zu tun, indem Sie den gesamten Inhalt der Datei in ein Array mit file
zu lesen, aber ich möchte dies mit fopen
erreichen.)
Lösung
Es gibt eine „Position“ im Speicher gehalten für jede Datei, die geöffnet wird; es wird automatisch jedes Mal, wenn Sie lesen gerade eine Zeile / Zeichen / was auch immer aus der Datei aktualisiert.
Sie können diese Position erhalten mit ftell
, und ändern Sie es mit < a href = "http://php.net/manual/en/function.fseek.php" rel = "nofollow noreferrer"> fseek
:
ftell - Liefert die aktuelle Position die Datei Lese- / Schreibzeiger
fseek - Positioniert auf einem Dateizeiger
Sie können auch verwenden rewind ... rewind ... die Position des Zeigers.
Dies ist nicht eine Position als Zeilennummer bekommen, aber näher an eine Stelle als Zeichenzahl (eigentlich sind Sie die Position als eine Anzahl von Bytes vom Anfang der Datei immer) ; wenn Sie das haben, eine Zeile zu lesen ist nur ein metter lesen Zeichen bis yu ein Ende der Zeile Zeichen getroffen.
BTW: soweit ich mich erinnere, kommt diese Funktionen aus der Programmiersprache C - PHP selbst in C geschrieben ist; -)
Andere Tipps
Die Dateien sind nur ein Strom von Daten, von Anfang bis zum Ende gelesen. Das Betriebssystem wird sich erinnern, die Position, die Sie in dieser Datei bisher gelesen habe. Bei Bedarf ist dabei in der Anwendung als auch ziemlich einfach. Das Betriebssystem kümmert sich nur um Byte-Positionen aber nicht Linien.
Man stelle sich vor der Reihe nach ein Deck aus 52 Karten austeilt. Hand von Ihnen die erste Karte. Das nächste Mal die 2. Karte. Wenn Sie die 3. Karte geben wollen, müssen Sie nicht wieder das Zählen von Anfang an starten, oder auch dann, wenn Sie die Erinnerung waren Sie die nächste verfügbare Karte auszuteilen nur, und das wird die dritte sein.
Es könnte ein bisschen mehr Arbeit, die Zeilen zu lesen benötigt wird, da man sich wünschen kann, um Daten aus der Datei für preformance Sake Lesepuffer, aber es ist nicht, dass es viel mehr als das Offset des letzten Stückes aufzeichnen von Daten, die Sie übergeben, um die nächsten newline-Zeichen und die Hand von allen Daten zwischen diesen zwei Punkten finden.
PHP noch das OS hat keine wirkliche Notwendigkeit, um die Zeilennummer zu halten, da alle Systempflege über „nächste Zeile“ ist. Wenn Sie die Zeilennummer wissen wollen, halten Sie einen Zähler und erhöhen es jedes Mal Ihre Anwendung eine Zeile liest.
$lineno=0;
while (!feof($handle)) {
$buffer = fgets($handle, 4096);
lineno++; // keep track of the line number
...
}
i hav diese alte Probe i seine Dose Hilfe Kochfeld Sie:)
$File = file('path');
$array = array();
$linenr = 5;
foreach( $File AS $line_num => $line )
{
$array = array_push( $array , $line );
}
echo $array[($linenr-1)];
Sie könnten nur fgets
anrufen und eine var $line_number
jedes Mal, wenn Sie es nennen erhöhen. Das würde Ihnen sagen, die Linie ist es auf.