txt auslesen in array und bestimmten teil ändern
cr
- php
hallo,
ich habe folgende datei (txt):
eintrag1|eintrag11|eintrag14
usw..
und folgendes php-script:
$datei = file('datei.txt');
foreach($datei as $zeile)
{
$zeile = trim($zeile);
$zeile = explode('|',$zeile);
echo "<form action='' method='post'><input type='text' value='$zeile[1]'><input type='submit'></form>";
}
normalerweise bearbeite ich dateien mit fopen, fwrite und fclose, damit kann ich aber nur ans ende oder an den anfang der datei schreiben, wie kann ich hier den mitterlen eintrag11 austauschen?
danke für eure hilfe
Hallo cr.
ich habe folgende datei (txt):
eintrag1|eintrag11|eintrag14
usw..
und folgendes php-script:
$datei = file('datei.txt');
foreach($datei as $zeile)
{
$zeile = trim($zeile);
$zeile = explode('|',$zeile);
echo "<form action='' method='post'><input type='text' value='$zeile[1]'><input type='submit'></form>";
}
>
> normalerweise bearbeite ich dateien mit fopen, fwrite und fclose, damit kann ich aber nur ans ende oder an den anfang der datei schreiben, wie kann ich hier den mitterlen eintrag11 austauschen?
~~~php
$zeile[1] = 'wasauchimmer';
$zeile = [link:http://de.php.net/manual/de/function.implode.php@title=implode]('|', $zeile);
$datei = implode("\n", $datei);
[link:http://de.php.net/manual/de/function.file-put-contents.php@title=file_put_contents]('datei.txt', $datei);
Einen schönen Sonntag noch.
Gruß, Mathias
hallo,
danke für die hilfe, aber irgendwie habe ich noch einen fehler im script?
<?
$datei = file('test.txt');
foreach($datei as $zeile)
{
$zeile = explode('|',$zeile);
$zeile[1] = 'neuereintrag';
$zeile = implode('|',$zeile);
file_put_contents('test.txt',$datei);
}
?>
inhalt test.txt
123|123|123|
das script führt sich zwar ohne fehlermeldung aus, aber der wert wird nicht geändert. was mache ich falsch?
danke und ebenfalls einen schönen sonntag.
Hallo cr.
danke für die hilfe, aber irgendwie habe ich noch einen fehler im script?
<?
$datei = file('test.txt');
foreach($datei as $zeile)
{
$zeile = explode('|',$zeile);
$zeile[1] = 'neuereintrag';
$zeile = implode('|',$zeile);
file_put_contents('test.txt',$datei);
}
?>inhalt test.txt
123|123|123|
das script führt sich zwar ohne fehlermeldung aus, aber der wert wird nicht geändert. was mache ich falsch?
Du übersiehst die Wirkungsweise des foreach-Konstruktes. Dieses arbeitet so lange mit Referenzen, bis eine Modifikation innerhalb der Schleife durchgeführt wird. Dann wird zuerst eine Kopie des zu modifizierenden Wertes angefertigt. Der Originalwert bleibt somit unverändert. Du möchtest also eher so etwas:
<?php
# Short-Open-Tags zeugen von keinem guten Stil und laufen nicht überall
error_reporting(E_ALL); # Sollte im Schlaf getippt werden
$datei = file('test.txt');
foreach ($datei as $index => $wert) {
$wert = explode('|', $wert);
$wert[1] = 'neuereintrag';
$wert = implode('|', $wert);
$datei[$index] = $wert;
}
# Nicht bei jedem Schleifendurchlauf speichern
file_put_contents('test.txt',$datei);
?>
danke und ebenfalls einen schönen sonntag.
Einen schönen Sonntag noch.
Gruß, Mathias
echo $begrüßung;
Du übersiehst die Wirkungsweise des foreach-Konstruktes. Dieses arbeitet so lange mit Referenzen, bis eine Modifikation innerhalb der Schleife durchgeführt wird. Dann wird zuerst eine Kopie des zu modifizierenden Wertes angefertigt. Der Originalwert bleibt somit unverändert.
Das würde ich nicht so propagieren, weil dieses interne PHP-Verhalten, bei einer Zuweisung von einer Variable an eine andere, diesen Inhalt erst dann zu kopieren bzw. ein zweites Mal im Speicher abzulegen, wenn sich der Inhalt einer von beiden ändert, nicht auf das foreach-Konstrukt beschränkt ist, und weil zum anderen dieses Verhalten für den PHP-Programmierer im Allgemeinen recht uninteressant ist.
Für das foreach-Konstrukt
foreach($array as $key => $value)
sollte man sagen, dass $value stets eine Kopie von $array[$key] ist. Wünscht man den Wert im Array zu ändern, muss man darauf mit $array[$key] zugreifen oder ab PHP5 $value mittels des Referenz-Operators & zu einer Referenz auf $array[$key] machen.
foreach($array as $key => &$value)
echo "$verabschiedung $name";
Hello,
die ganzen gegeben Hinweise haben noch einen wesentlichen Fehler:
Es scheint sich doch hier um eine Textdatei zu handeln, in der durch ein Trennzeichen "Spalten" erzeugt werden. Jeder Datensatz (jede Zeile) wird mit einem CRLF (was auch immer sich dahinter verbirgt...) abgeschlossen.
Die Funktiopn file() ist leider noch zu blöd, das von der Zeile gleich abzuschneiden.
Nach dem Separieren in einzelne Felder durch explode() steckt also im letzten Feld immer noch das dringend benötigte CRLF. Wenn man nun die letzte Spalte austauscht, ist es verschwunden und aus zwei Datensätzen wird dadurch einer.
Das muss beachtet werden.
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom