cr: txt auslesen in array und bestimmten teil ändern

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

  1. 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

    --
    ie:% fl:| br:< va:) ls:& fo:) rl:( n4:~ ss:) de:] js:| mo:| zu:)
    debian/rules
    1. 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.

      1. 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

        --
        ie:% fl:| br:< va:) ls:& fo:) rl:( n4:~ ss:) de:] js:| mo:| zu:)
        debian/rules
        1. 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";

  2. 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

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau