Paulchen: str_replace in array

Hallo Zuammen,

ich stehe vor folgendem Problem.

Ich möchte gerne ein str_replace in einer bestimmten array Zeile ausführen.

z.B.

  
a  
b  
a  
c  
a  
b  

Hier möchte ich, dass der str_replace nur in array Zeile 2 das "a" gegen ein "b" tauscht.

Leider tauscht ein str_replace ja "a" in diesem Beispiel aus. Wie kann ich dem str_replace vermitteln, in welcher Zeile er nur etwas ersetzen soll?

Viele Grüße

Paulchen

  1. Hier möchte ich, dass der str_replace nur in array Zeile 2 das "a" gegen ein "b" tauscht.

    $array[1] = str_replace('b', 'a', $array[1]);

    Leider tauscht ein str_replace ja "a" in diesem Beispiel aus. Wie kann ich dem str_replace vermitteln, in welcher Zeile er nur etwas ersetzen soll?

    Geht das auch verständlich? Willst du jetzt a austauschen oder nicht?

    1. Hier möchte ich, dass der str_replace nur in array Zeile 2 das "a" gegen ein "b" tauscht.

      $array[1] = str_replace('b', 'a', $array[1]);

      Leider tauscht ein str_replace ja "a" in diesem Beispiel aus. Wie kann ich dem str_replace vermitteln, in welcher Zeile er nur etwas ersetzen soll?

      Geht das auch verständlich? Willst du jetzt a austauschen oder nicht?

      Oo sry, etwas komisch geschrieben:) Ich meinte damit, das str_replace nur das "a" in der Zeile in ein "b" ändern soll und nicht die anderen auch :P

      aber so ganz scheint das nicht zu funktionieren. Hier mal mein code.

        
      $pz = 1;  
      $datei1 = fopen('bla.txt', 'r+');  
      $pz = $pz + "3";  
        
      $dateiinhalt = file_get_contents("bla.txt");  
      $dateiinhalt[$pz] = str_replace('a', 'b', $dateiinhalt[$pz]);  
      fwrite($datei1,$dateiinhalt[$pz]);  
      fclose($datei1);  
      
      

      was mache ich falsch?

      1. Hi,

        $pz = 1;
        $datei1 = fopen('bla.txt', 'r+');
        $pz = $pz + "3";

        $dateiinhalt = file_get_contents("bla.txt");
        $dateiinhalt[$pz] = str_replace('a', 'b', $dateiinhalt[$pz]);
        fwrite($datei1,$dateiinhalt[$pz]);
        fclose($datei1);

        
        >   
        > was mache ich falsch?  
          
        So ziemlich alles.  
        fopen und file\_get\_contents sind in Kombination Blödsinn - bitte lies im handbuch zu file\_get\_contents nach, wie die Funktion arbeitet.  
        Und ein Array, von dem du uns hier erzählst, hast du momentan auch überhaupt keins.  
          
        MfG ChrisB  
          
        
        -- 
        RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
        
        1. Und ein Array, von dem du uns hier erzählst, hast du momentan auch überhaupt keins.

          @Paulchen da hat er leider recht. Wenn du anstelle von file_get_contents() einfach nur file() benutzt, dann hast du ein Array, dass zeilenweise deine Datei wiederspiegelt.

          [0]Gruß
          [1]T-Rex

          1. Und ein Array, von dem du uns hier erzählst, hast du momentan auch überhaupt keins.

            @Paulchen da hat er leider recht. Wenn du anstelle von file_get_contents() einfach nur file() benutzt, dann hast du ein Array, dass zeilenweise deine Datei wiederspiegelt.

            [0]Gruß
            [1]T-Rex

            Aber ich kann die Datei dann so nicht abspeichern oder?
            Weil dies geht doch nur mit fclose und um fclose zu bentutzen muss sie die datei doch mit fopen öffnen oder liege ich hier falsch?

            1. Hallo,

              @Paulchen da hat er leider recht. Wenn du anstelle von file_get_contents() einfach nur file() benutzt, dann hast du ein Array, dass zeilenweise deine Datei wiederspiegelt.

              Aber ich kann die Datei dann so nicht abspeichern oder?

              sicher: mit file_put_contents.

              Freundliche Grüße

              Vinzenz

              1. Hallo,

                @Paulchen da hat er leider recht. Wenn du anstelle von file_get_contents() einfach nur file() benutzt, dann hast du ein Array, dass zeilenweise deine Datei wiederspiegelt.

                Aber ich kann die Datei dann so nicht abspeichern oder?

                sicher: mit file_put_contents.

                Freundliche Grüße

                Vinzenz

                Danke für den Tipp.

                Aber ich muss doch dann mit file_get_contents den inhalt wieder in ein string setzen oder nicht? Weil dort liegt irgendwie mein Problem.

                  
                  
                <?php  
                $datei1 = file('bla.txt');  
                $pz = "7";  
                  
                $current = file_get_contents($datei1);  
                $current[$pz] = str_replace('a', 'b', $current[$pz]);  
                  
                file_put_contents($datei1, $datei1[$pz]);  
                  
                  
                echo"$datei1";  
                ?>  
                
                

                Ich kapier das gerade net so ganz.

                1. Also du brauchst den Inhalt einer Datei. Um Zugriff auf eine Datei zu bekommen brauchst du einen Datei Handler. Diesen brauchst du wiederum um dem Betriebsystem zu sagen dass die Datei gerade in Bearbeitung ist. Es wäre fatal, wenn du die Datei gerade lesen möchtest und ein anderer löscht sie dir einfach unter dem Hinter weg. Wobei dieser Punkt spielt bei PHP eigentlich keine Rolle, soll aber verdeutlichen, dass so ein Handler eine Daseins Berechtigung hat.
                  Diesen Handler brauchst du auch um die Datei eindeutig zu kennzeichnen. Dann holst du mittel fgets die Zeilen aus der Datei. Dafür brauchst du eine Schleife, die jede Zeile durchgeht und dir in Variablen oder ein Array schmeißt. Wenn du fertig bist schließt du alles wieder mit fclose.

                  Um etwas aus einer Datei zu lesen brauchst du alle obigen Schritte. Deswegen geht ein guter Entwickler her und baut sich dafür eine Funktion. Naja so wars in der Vergangenheit, denn die Entwickler von PHP sind ja nicht doof und arbeiten (anders als viele Spiele Hersteller) mit der Community zusammen. Deshalb waren sie so freundlich und haben diese Funktionen in einer Funktion gekapselt. Die Funktion "file" macht also nichts anders als das oben beschriebene. Davon bekommst du als Aufrufer aber nichts mit. Du bekommst nur ein Array (oder eben einen String bei file_get_contents()).

                  Der Inhalt der Datei ist dann in deiner Variable und die Datei ist wieder geschlossen als ob nicht passiert wäre. Dann kannst du den Inhalt den du eben bekommen hast bearbeiten. Wenn du fertig bist möchtest du das ganze eventuell wieder in eine Datei speichern. Und auch hier gibt es immer den gleichen Vorgang - Datei aufmachen, Zeilenweise in Datei schreiben Datei zumachen. Und auch hier haben sich die Entwickler entschlossen das ganze praktischerweise in eine Funktion zu packen. Deshalb gibt es file_put_contents().

                  file_put_contents("Gruß T-Rex");

                  1. Achja diese "file_" Befehle gibt es erst ab php 5... wollte ich hier nur nochmal schreiben, da ich gerade ca. 2 Stunden "Fehlentwicklung" betrieben hab, da der Server für den ich etwas programmiert hab auf php 4 steht...php 4...verdammt nochmal php 4.... KOTZ

                    Gruß
                    Fehlgeleiteter
                    T-Rex

                    1. Tach!

                      Achja diese "file_" Befehle gibt es erst ab php 5...

                      file_get_contents() gibt es schon seit PHP 4.3 und file_put_contents() lässt sich bei Bedarf auch aus PHP-Code nachbilden. Fertige Ausführungen findet man in den User-Kommentaren des PHP-Handbuchs.

                      dedlfix.

            2. Hallo,

              @Paulchen da hat er leider recht. Wenn du anstelle von file_get_contents() einfach nur file() benutzt, dann hast du ein Array, dass zeilenweise deine Datei wiederspiegelt.
              Aber ich kann die Datei dann so nicht abspeichern oder?
              Weil dies geht doch nur mit fclose und um fclose zu bentutzen muss sie die datei doch mit fopen öffnen oder liege ich hier falsch?

              Du scheinst da etwas zu verwechseln. Der Befehl file() gibt dir ein Array zurück in der jede Zeile der Datei einem Eintrag in diesem Array entspricht.

              file_get_contents() gibt dagegen _kein_ Array zurück sondern die ganze Datei in nur einem einzelnen String.

              Beide lesen nur daten aus einer Datei und geben sie an dein Script in verschiedener Form zurück. Keines der beiden kann in eine Datei schreiben. Zum Schreiben gibt es z.B. die Funktion

              • file_put_contents() die einen String oder ein Array mit Strings (das es dann mit "\n" joint) nimmt und ihn so in eine Datei schreibt
              • oder die Funktion fwrite() die einen File-Handler und einen String nimmt und diesen String in die Datei auf die der File-Handler zeigt schreibt.

              fwrite() sieht man oft in Zusammenhang mit fopen() und fclose():

              $file_handler = fopen("path/to/file.txt", "w");  
              fwrite($file_handler, "String der in die Datei geschrieben wird");  
              fclose($file_handler);
              

              Im endeffekt kan man sich file_put_contents() als Kurzschreibweise für das Konstrukt mit fopen(), fwrite() und fclose() denken und das oben erwähnte file_get_contents() als Kurzschreibweise für ein ähnliches Konstrukt das aber die daten liest, und zwar: fopen(), fread() und fclose().

              Was du also machen könntest ist erst mit file() die Datei in ein Array reintun, dann drüber laufen und die daten verändern und schlussendlich mit file_put_contents() in die Datei wieder schreiben.

              $path = "path/to/file.txt";  
              $lines = file($path);  
              for($i = 0; $i < count($lines); $i++) {  
                $lines[$i] = str_replace("a", "b");  
              }  
              file_put_contents($path, $lines);
              

              (Alles ungetestet und nur schnell aus dem Kopf geschrieben, bitte die Dokumentation für die exakte funktionsweise konsultieren.)

              Jeena

              1. Hallo,

                $path = "path/to/file.txt";

                $lines = file($path);
                for($i = 0; $i < count($lines); $i++) {
                  $lines[$i] = str_replace("a", "b");
                }
                file_put_contents($path, $lines);

                  
                Ah hehe und schon einen Fehler gefunden, `$lines[$i] = str_replace("a", "b", $lines[$i]);`{:.language-php} hätte es sein soll.  
                  
                   Jeena  
                ![](http://jeenaparadies.net/pavatar.png)
                
                -- 
                [Jlog](http://jeenaparadies.net/webdesign/jlog/) | [Gourmetica Mentiri](http://jeenaparadies.net/gourmetica-mentiri/)
                
              2. Hi,

                • file_put_contents() die einen String oder ein Array mit Strings (das es dann mit "\n" joint) nimmt

                Wieso \n?

                Zitat von dir verlinkter Manualseite:

                You can also specify the data parameter as a single dimension array. This is equivalent to file_put_contents($filename, implode('', $array)).

                Kein \n, sondern nur alles aneinandergehängt.

                MfG ChrisB

                --
                RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
                1. Hallo,

                  Wieso \n?

                  Warscheinlich weil ich mir die Doku nicht genau angesehen habe.

                  Zitat von dir verlinkter Manualseite:

                  You can also specify the data parameter as a single dimension array. This is equivalent to file_put_contents($filename, implode('', $array)).
                  Kein \n, sondern nur alles aneinandergehängt.

                  Jo stimmt auf jeden fall und macht ja auch sehr viel sinn. file() wird dann wohl auch die "\n" am ende der Zeilen gar nicht wegmachen (hab aber auch wieder nicht in die Doku geschaut).

                  Jeena

                  1. Hi,

                    file() wird dann wohl auch die "\n" am ende der Zeilen gar nicht wegmachen

                    Per Default nicht, aber seit PHP 5.0.0 kann man das über den zweiten Parameter mit dem Flag FILE_IGNORE_NEW_LINES erreichen.

                    MfG ChrisB

                    --
                    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?