xpfreund: Arrayinhalt in Datei austauschen

Hallo,

Ich wollte fragen, wie man das hier am besten löst:
In einer PHP-Datei steht ein Array
$schmeckt={"Bier","Sekt","Wein"}

Das soll aber in
$schmeckt={"Schnaps","Bier",Wein"}

geändert werden und in die Datei geschrieben werden.
Dabei kann der Arrayinhalt in der Länge und im Inhalt variieren.
Datei öffnen -> klar
strpos findet die Zeile, wo $schmeckt, steht.
Jetzt die Frage: Wie tausche ich den kompletten Arrayinhalt gegen den neuen aus? strreplace passt der vielleicht nicht, da beide Inhalte ja variabel sind.
in Datei schreiben und schließen -> auch klar

gruß aus Senftenberg am See

  1. Mahlzeit,

    ohne zu fragen, WARUM du das tun willst (erscheint mir auf den ersten Blick ziemlich merkwürdig), würde ich folgendes empfehlen:

    Datei öffnen -> klar

    Und anschließend die Datei zeilenweise einlesen (z.B. in ner Schleife oder in ein Array mit einer Zeile pro Element oder so).

    strpos findet die Zeile, wo $schmeckt, steht.
    Jetzt die Frage: Wie tausche ich den kompletten Arrayinhalt gegen den neuen aus? strreplace passt der vielleicht nicht, da beide Inhalte ja variabel sind.

    Ganz einfach: tausch doch einfach alles hinter "$schmeckt=" bis zum Zeilenende ("\n") gegen das neue Array aus.

    MfG,
    EKKi

    1. Hallo,

      Mahlzeit,

      ohne zu fragen, WARUM du das tun willst (erscheint mir auf den ersten Blick ziemlich merkwürdig), würde ich folgendes empfehlen:

      Und zwar ich schreibe eine Website für die Kirchengemeinden der näheren Umgebung. Jetzt wollte ich ein Konfigurationsprogramm schreiben. D. h. Ich lasse sämtliche Menüpunkte in einem Array erstellen und die können dann durch das Programm das Array mit den Menüpunkten verändern.

      Datei öffnen -> klar

      Und anschließend die Datei zeilenweise einlesen (z.B. in ner Schleife oder in ein Array mit einer Zeile pro Element oder so).

      Es wird nur ein zwei Zeilen geben.

      strpos findet die Zeile, wo $schmeckt, steht.
      Jetzt die Frage: Wie tausche ich den kompletten Arrayinhalt gegen den neuen aus? strreplace passt der vielleicht nicht, da beide Inhalte ja variabel sind.

      Ganz einfach: tausch doch einfach alles hinter "$schmeckt=" bis zum Zeilenende ("\n") gegen das neue Array aus.

      Stimmt, dann muss ich nur noch /n dazuschreiben.

      gruß aus Senftenberg am See

      1. Hi xpfreund!

        Und zwar ich schreibe eine Website für die Kirchengemeinden der näheren Umgebung.

        Ah, jetzt wird mir einiges klar! Schon Jesus hat ja bekanntlich Sekt zu Schnaps gemacht.

        scnr,
        Benjamin

        --
        Selfcode: ie:} fl:{ br:> va:) ls:< fo:( rl:? n4:# ss:| de:] js:| ch:? sh:( mo:? zu:)
        "Das Problem kennen ist wichtiger, als die Lösung zu finden, denn die genaue Darstellung des Problems führt automatisch zur richtigen Lösung."
        (Albert Einstein)
        1. Hallo,

          Hi xpfreund!

          Und zwar ich schreibe eine Website für die Kirchengemeinden der näheren Umgebung.
          Ah, jetzt wird mir einiges klar! Schon Jesus hat ja bekanntlich Sekt zu Schnaps gemacht.

          Das war eigentlich Wasser zu Wein, aber ist egal, denn Schnaps schmeckt sowieso besser.

          gruß aus Senftenberg am See

          1. Hi,

            Ah, jetzt wird mir einiges klar! Schon Jesus hat ja bekanntlich Sekt zu Schnaps gemacht.
            Das war eigentlich Wasser zu Wein, aber ist egal, denn Schnaps schmeckt sowieso besser.

            Jesus war auch aktiv in der Herstellung hochprozentiger Alkoholika involviert. Seine letzten[1] Worte lauten bekanntlich: "Vater, in Deine Hände lege ich meinen Geist!", was als Beweis hinreichen sollte. Später wurde dies in einem bekannten Volkslied verarbeitet: "'Schnaps!', das war sein letztes Wort, dann trugen ihn die Englein fort."

            Cheatah

            [1] Jaja, "es ist vollbracht", ich weiß. Er war wohl mit dem Ergebnis seiner Destillierung zufrieden gewesen.

            --
            X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
            X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
            X-Will-Answer-Email: No
            X-Please-Search-Archive-First: Absolutely Yes
            1. Hallo,

              Hi,

              Ah, jetzt wird mir einiges klar! Schon Jesus hat ja bekanntlich Sekt zu Schnaps gemacht.
              Das war eigentlich Wasser zu Wein, aber ist egal, denn Schnaps schmeckt sowieso besser.

              Jesus war auch aktiv in der Herstellung hochprozentiger Alkoholika involviert. Seine letzten[1] Worte lauten bekanntlich: "Vater, in Deine Hände lege ich meinen Geist!", was als Beweis hinreichen sollte. Später wurde dies in einem bekannten Volkslied verarbeitet: "'Schnaps!', das war sein letztes Wort, dann trugen ihn die Englein fort."

              Cheatah

              [1] Jaja, "es ist vollbracht", ich weiß. Er war wohl mit dem Ergebnis seiner Destillierung zufrieden gewesen.

              Da siehst du, er hat eben auch gern mal einen gehoben.
              Abgesehen davon, er hat selbst gepredigt: "Du sollst deine Feinde lieben!"
              Der Alkohol war sein Feind. Also von daher...

              gruß aus Senftenberg am See

              1. Hi,

                Jesus war auch aktiv in der Herstellung hochprozentiger Alkoholika involviert. [...]
                Da siehst du, er hat eben auch gern mal einen gehoben.

                inklusive sich selbst, aber vermutlich war er nur zu faul zum Schwimmen. Sein Sport war halt eher Basketball.[1]

                Abgesehen davon, er hat selbst gepredigt: "Du sollst deine Feinde lieben!"
                Der Alkohol war sein Feind. Also von daher...

                Ich halte es da eher mit der Bundeswehr[2], die ihre Feinde vernichtet. Und mein ganz persönlicher Erzfeind ist eindeutig Scotch Single Malt. Ich vernichte ihn regelmäßig und mit Genuss!

                [1] Ist bekannt, oder? Jesus war der erste Basketball-Spieler: Er nahm das Brot und dunkte.
                [2] Die ja auch schon in der Bibel verewigt ist: "Sie trugen seltsame Gewänder und irrten planlos umher."

                Cheatah

                --
                X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
                X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
                X-Will-Answer-Email: No
                X-Please-Search-Archive-First: Absolutely Yes
                1. Hallo,

                  Da siehst du, er hat eben auch gern mal einen gehoben.

                  inklusive sich selbst, aber vermutlich war er nur zu faul zum Schwimmen. Ist doch logisch, wäre er sonst übers Wasser gegangen, wenn er nich so faul gewesen wäre?

              2. Hi,

                [1] Jaja, "es ist vollbracht", ich weiß. Er war wohl mit dem Ergebnis seiner Destillierung zufrieden gewesen.
                Da siehst du, er hat eben auch gern mal einen gehoben.
                Abgesehen davon, er hat selbst gepredigt: "Du sollst deine Feinde lieben!"
                Der Alkohol war sein Feind. Also von daher...

                Mensch, bedenke! Bedenke wohl,
                Dein größter Feind ist Alkohol!
                Doch in der Bibel steht geschrieben:
                Deine Feinde sollst Du lieben!

                cu,
                Andreas

                --
                Warum nennt sich Andreas hier MudGuard?
                O o ostern ...
                Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
      2. echo $begrüßung;

        Und zwar ich schreibe eine Website für die Kirchengemeinden der näheren Umgebung. Jetzt wollte ich ein Konfigurationsprogramm schreiben. D. h. Ich lasse sämtliche Menüpunkte in einem Array erstellen und die können dann durch das Programm das Array mit den Menüpunkten verändern.

        Für den Zweck würde ich das Array serialisieren und das in einer Datei ablegen. Mit den Umkehrfunktionen (file_get_contents() und unserialize()) hast du wieder ein Array. Noch etwas Fehlerbehandlung drumrum - schließlich kann ja jemand auf die Idee kommen, den Dateiinhalt per Hand zu versau... ähm bearbeiten, was zu einen nicht erfolgreichen unserialize() führen kann - fertig.

        echo "$verabschiedung $name";

        1. Hello,

          [...] in einer Datei ablegen. Mit den Umkehrfunktionen (file_get_contents() [...]

          sind ohne weitere Maßnahmen (Krücken) ungeeignet für die Behandlung konsistenter Daten.

          Beides sind namensbasierte Funktionen und unterliegen damit leider nicht den Lockingmechainsmen für mandantory oder advisory Filelocking.

          Ich konnte bisher nicht erkennen, dass die PHPler das repariert hätten.

          Harzliche Grüße vom Berg
          http://bergpost.annerschbarrich.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          Nur selber lernen macht schlau
          Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

          1. echo $begrüßung;

            [...] in einer Datei ablegen. Mit den Umkehrfunktionen (file_get_contents() [...]
            sind ohne weitere Maßnahmen (Krücken) ungeeignet für die Behandlung konsistenter Daten.
            Beides sind namensbasierte Funktionen und unterliegen damit leider nicht den Lockingmechainsmen für mandantory oder advisory Filelocking.

            Das ist soweit richtig. Die Frage ist nur, wie relevant das für das konkrete Projekt ist. Es scheint sich sich um ein Administrationstool zu handeln. Das heißt, ein Admin wird alle Jubeljahre mal eine Änderung vornehmen wollen. Vielleicht auch öfter, aber wie oft wird es vorkommen, dass zwei Admins zur selben Zeit diesen Vorgang ausführen wollen? Obwohl diese theoretische Möglichkeit besteht, würde ich sie wegen zu geringer Wahrscheinlichkeit einfach ignorieren.

            echo "$verabschiedung $name";

            1. Hello,

              Das ist soweit richtig. [...] Obwohl diese theoretische Möglichkeit besteht, würde ich sie wegen zu geringer Wahrscheinlichkeit einfach ignorieren.

              warum, eine vernünftige und konsequente Impelementation JETZT GLEICH einzuführen, ist doch unwesentlich komplizierter.

              Da man aus den fraglichen Abschnitten Funktionen machen kann, die man immer wieder verwenden kann (M$ macht soweas seit 1980), sollte man sich lieber jetzt die Stunde Zeit nehmen, als später 1000fach die 12 bis 25 Minuten für "warum geht das jetzt schief?"...

              siehe Thread https://forum.selfhtml.org/?t=160412&m=1043325

              Sollte der OP an einer nachhaltigen Umsetzung interessiert sein, können wir die notwendigen Funktionen gerne in diesem Thread gemeinsam entwickeln.

              Harzliche Grüße vom Berg
              http://bergpost.annerschbarrich.de

              Tom

              --
              Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
              Nur selber lernen macht schlau
              Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

              1. echo $begrüßung;

                Das ist soweit richtig. [...] Obwohl diese theoretische Möglichkeit besteht, würde ich sie wegen zu geringer Wahrscheinlichkeit einfach ignorieren.

                Da ich wenig mit Dateien arbeite, gab ich dir recht, ohne das weiter nachzuprüfen. Doch nun begab ich mich nochmel ins Handbuch.

                warum, eine vernünftige und konsequente Impelementation JETZT GLEICH einzuführen, ist doch unwesentlich komplizierter.

                Was ist eigentlich mit dem Flag LOCK_EX, das man bei file_put_contents() setzen kann?

                echo "$verabschiedung $name";

                1. Hello,

                  Was ist eigentlich mit dem Flag LOCK_EX, das man bei file_put_contents() setzen kann?

                  Das war mir zwar auch entgangen, dass es das jetzt gibt (seit Version 5.1), aber es nützt hier nichts.

                  Zum verlustfreien Bearbeiten von Daten muss der gesamte Lese- und Scheibprozess mit einem gemeinsamen EXCLUSIVE LOCK geschützt werden.

                  Um sicherzustellen, dass keine Überschneidungen mit anderen Prozessen stattfinden, muss zum Zwecke der _sofortigen_ Veränderung nebst Wegschreiben auch der Prozess des Holens im LOCK_EX-Zeitabschnitt stattfinden. Dadurch wird der Prozess der Datenveränderung "Atomar".

                  Mit file_get_contents() und file_put_contents() ist dies nicht möglich, da sie immer auf zwei Prozesse verteilt bleiben werden. Dies ermöglicht immer einem dritten Prozess das Eindringen in die zeitliche Abfolge.

                  Anstelle der von mir benutzten Variante mit "a" kann man auch "x" benutzen, muss dann aber den Fehler auswerten.

                  Im Prinzip ist advisory Locking, dass ja immer mit einem seperaten Lockbefehl nach dem fopen() arbeitet, immer noch eine relativ störanfällige Methode. Mandatory Locking (von System36 / AS400 auf die PCs und ELS2 von NOVELL übertragen), ist wesentlich sicherer.
                  Hier werden die Anforderungen im OS-Kern für das Filesystem gebündelt. Man fordert also ein fopen gleich mit dem Attribut SINGLE_OPEN (Kompatibility Mode), SHARED, LOCK_SH oder LOCK_EX an, wobei SHARED nur bedeutet, das keine einschränkenden Attribute gesetzt sind.

                  Es hat also auch KEINEN Sinn,
                                   ------
                                                     <-----------+
                    die Datei zu öffen                           |
                    mit LOCK_SH zu versehen                      |
                                                                 |
                    auszulesen                                   |  Dieser gesamte Bereich ist noch gefährdet,
                    die Daten zu verändern                       |  dass weitere Prozesse dasselbe beginnen.
                                                                 |
                    ein LOCK_EX anzufordern          <-----------+

                  die Daten wegzuschreiben
                    die Datei zu schließen und zu entsperren

                  <------------  und dann ggf. erst hier ein eigenes
                                                                    LOCK_EX anfordern
                                                                    um Daten zurückzuschreiben

                  Harzliche Grüße vom Berg
                  http://bergpost.annerschbarrich.de

                  Tom

                  --
                  Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                  Nur selber lernen macht schlau
                  Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

            2. Hallo,

              Das ist soweit richtig. Die Frage ist nur, wie relevant das für das konkrete Projekt ist. Es scheint sich sich um ein Administrationstool zu handeln. Das heißt, ein Admin wird alle Jubeljahre mal eine Änderung vornehmen wollen. Vielleicht auch öfter, aber wie oft wird es vorkommen, dass zwei Admins zur selben Zeit diesen Vorgang ausführen wollen? Obwohl diese theoretische Möglichkeit besteht, würde ich sie wegen zu geringer Wahrscheinlichkeit einfach ignorieren.

              Du hast es erfasst. Es wird definitiv nur einen Administrator geben und das ist der Kunde selbst. Es geht einfach darum, ihm die einfache Möglichkeit zu geben, über das Tool frei Menüpunkte hinzufügen und entfernen zu können und in dem Zusammenhang auch weitere Seiten hinzufügen kann. Da man bei der Seite getrost auf w3c verzichten kann, werden die Texte einfach von Word als Html includet.

              gruß aus Senftenberg am See

  2. Hi xpfreund!

    Jetzt die Frage: Wie tausche ich den kompletten Arrayinhalt gegen den neuen aus? strreplace passt der vielleicht nicht, da beide Inhalte ja variabel sind.

    Ich würde versuchen, mittels Regulären Ausdrücken einfach den Text zwischen { und } zu ersetzen. Sofern ich das richtig verstanden habe, also egal was da steht, es soll mit

    "Schnaps","Bier",Wein"

    ersetzt werden?

    mfG
    Benjamin

    --
    Selfcode: ie:} fl:{ br:> va:) ls:< fo:( rl:? n4:# ss:| de:] js:| ch:? sh:( mo:? zu:)
    "Das Problem kennen ist wichtiger, als die Lösung zu finden, denn die genaue Darstellung des Problems führt automatisch zur richtigen Lösung."
    (Albert Einstein)
    1. Hallo,

      Hi xpfreund!

      Jetzt die Frage: Wie tausche ich den kompletten Arrayinhalt gegen den neuen aus? strreplace passt der vielleicht nicht, da beide Inhalte ja variabel sind.
      Ich würde versuchen, mittels Regulären Ausdrücken einfach den Text zwischen { und } zu ersetzen. Sofern ich das richtig verstanden habe, also egal was da steht, es soll mit
      "Schnaps","Bier",Wein"
      ersetzt werden?

      Es soll mit irgendwas gefüllt werden. Sozusagen: "Inhalt ungewiss".
      Das kommt aus Eingabefeldern.

      gruß aus Senftenberg am See

  3. Hello,

    Ich wollte fragen, wie man das hier am besten löst:
    In einer PHP-Datei steht ein Array

    $schmeckt={"Bier","Sekt","Wein"}

    Das ist aber ein String, wenn das dort so drinsteht.

    Wenn ein Array drinstehen würde, hätte ich es zumindest serialisiert.

    Im Folgenden lasse ich die Fehlerkontrollen weg, weise aber darauf hin, dass diese
    notwendig sind. Wenn man die Blöcke zu Funktionen vervollständigt kann man sie leicht
    einbauen!

    Erzeugen:
      $_schmeckt = array{"Bier","Sekt","Wein"};   ## Array erzeugen
      $stream = serialize($_schmeckt);            ## Stream daraus machen
      $fh = fopen($dateiname, 'w+');              ## Datei öffen
      flock ($fh, LOCK_EX);                       ## Datei sperren
      frite($fh, $stream);                        ## Datei schreiben
      fclose($fh);                                ## Datei schließen und entsperren

    Austauschen:
      $fh1 = fopen($dateiname, 'a');              ## Datei erzeugen, falls nicht vorhanden
      flock ($fh1, LOCK_SH);                      ## Datei mit Sperre gegen Schreibsperre belegen
      $fh2 = fopen($dateiname, 'r+');             ## Datei zum Lesen und Schreiben öffnen
      flock ($fh2, LOCK_SH);                      ## Ebenfalls Sperre gegen Schreibsperre setzen
      fclose($fh1);                               ## ggf. neu erzeugte Datei frei geben (schließen)
      flock ($fh2, LOCK_EX);                      ## Sperre auf Schreibsperre 'upgraden'
      $fsize = filesize($dateiname);              ## Dateigröße holen
      $stream = fread($fh2, $fsize);              ## Datei auslesen
      $_schmeckt = unserialize($stream);          ## Stream in Array zurückverwandeln
      ### Manipulationen am Array durchführen     ## Hier das Array verändern
      $stream = serialize($_schmeckt);            ## Array wieder in Stream umwandeln
      fseek($fh2, 0, SEEK_SET);                   ## Datensatzzeiger zurück auf Anfang
      fwrite($fh2,$stream);                       ## verändertes Array wegschreiben
      ftruncate($fh, strlen($strem));             ## Dateilänge anpassen auf veränderten Inhalt
      fclose($fh);                                ## Datei schließen und freigeben.

    Solange ein Dateihandle ein LOCK_SH hält, kann kein anderes ein LOCK_EX erhalten, aber beliebig viele sich zusätzlich auf das LOCK_SH aufschalten. LOCK_SH ist also eine Sperre gegen die Schreibsperre. Wenn ein Dateihandle als einziges ein LOCK_SH hält, kann es diese zum LOCK_EX (also zur vollwertigen Sperre) erweitern.

    Harzliche Grüße vom Berg
    http://bergpost.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)