1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

array_push in PHP

Dieses Thema im Forum "Web-Programmierung" wurde erstellt von stonie10, 15.07.07.

  1. stonie10

    stonie10 Welscher Taubenapfel

    Dabei seit:
    31.10.05
    Beiträge:
    760
    Hallo zusammen :)

    Ich bin dabei, ein kleines Script in PHP zu schreiben und habe jetzt ein kleines Problem:
    Ich habe in Datei 1 ein Array:
    Code:
    $test=array(1=>"a", "b", "c");
    
    So, über ein Formular möchte ich diesem Array nun einen Wert (z.B. "d") hinzufügen. Also setze ich die Funktion array_push ein:
    Code:
    include "file1.php";
    array_push($test, "d");
    
    Über ein echo $test[4] kann ich diesen (hinzugefügten) Wert dann auch erfolgreich ausgeben lassen. Soo, und jetzt kommt meine Frage ;)

    Diesen Wert "d" scheint PHP nur für die aktuelle Runtime dem Array hinzuzufügen, ich hätte aber gerne, dass in die Datei (file1.php, welches das Array beinhaltet), der neue Wert geschrieben wird. Versteht ihr was ich meine? :eek:

    Der Inhalt der Datei file1.php soll nach dem Aufruf des array_push so aussehen:
    Code:
    $test=array(1=>"a", "b", "c", [B]"d"[/B]);
    
    Hat vielleicht jemand eine (möglichst einfache ;)) Lösung parat?

    Schonmal Danke im Voraus :-*

    Grüße,
    stonie10
     
  2. Hobbes_

    Hobbes_ Gast

    Das ist nicht erstaunlich. Alle Variablen werden nur zur runtime aufrechterhalten.

    Es gibt verschiedene Lösungsmöglichkeiten, wie Du die Daten speichern kannst (je nach Verwendungszweck und Kenntnissen aufwendiger oder weniger).

    Eine einfache Variante wäre das speichern und laden des Arrays in einer einfachen Textdatei. Dazu benötigst Du im angegebenen Ordner jedoch Schreibrechte. Eine grundsätzlich praktische Funktion für beliebige Variablen (also auch Objekte oder Arrays) stellt serialize() mit dem Compagnon unserialize() dar.

    Ein Beispiel gar für ein fixfertiges counter-Objekt ist auf php.net dargestellt (Link), wobei es dort m.E. noch einige kleine Fehler drin hat.

    Eine einfache Variante zum testen (aus obgenanntem Grund ohne Objekt):
    Code:
    <?
    // start --> load array
    $array_filename ="dummy.txt";
    if file_exists($array_filename)
    {
      $test=unserialize(file_get_contents($array_filename));
    }
    else
    {
      $test=array(); // set your presets here in this line
    }
    
    
    // work
    
    // use your array $test as you like
    
    
    // end --> save array
    if($f = @fopen($array_filename,"w"))
    {
      if(!@fwrite($f, serialize($test)))
      {
         die("Could not write to file ".$array_filename);
      }
      @fclose($f);
    }
    else die("Could not open file ".$this->filename." for writing");
    ?>
    
    Tja, soweit ein rascher Vorschlag. Kann es im Moment gerade nicht testen --> Anpassung des Codes gem. Feedback. Denke daran, dass Du den Filenamen passend definierst (meist optimal absolute Adressierung mit ebenso Einschluss des Pfades zu Deinem www-Bereich) und dass das angegebene Verzeichnis für Schreibrechte freigegeben ist.
     
    #2 Hobbes_, 15.07.07
    Zuletzt von einem Moderator bearbeitet: 15.07.07
  3. stonie10

    stonie10 Welscher Taubenapfel

    Dabei seit:
    31.10.05
    Beiträge:
    760
  4. Hobbes_

    Hobbes_ Gast

    Hoffen wir, dass es funktioniert :)

    Bitte achte auf die oben noch gemachten Ergänzungen.
     
  5. stonie10

    stonie10 Welscher Taubenapfel

    Dabei seit:
    31.10.05
    Beiträge:
    760
    So, ich habs jetzt hinbekommen :)
    Dein Skript funktioniert wunderbar, ich kann Werte in das Array hineinschreiben und auch wieder auslesen. Perfekt :-D

    Ich hätte da nur noch eine kleine Frage: Das Array, welches sich in der Textdatei befindet, sieht etwas "seltsam" aus:

    Code:
    a:3:{i:0;s:9:[B]"Eintrag 1"[/B];i:1;s:15:[B]"zweiter Eintrag"[/B];i:2;s:20:[B]"und noch ein Eintrag"[/B];}
    
    Diese Art von Array habe ich bisher noch nie gesehen. Es gibt nicht zufällig eine Möglichkeit, ein Array alà array("1","2"); da reinzuschreiben oder?
    Nicht, dass das jetzt unbedingt notwendig wäre, mein (bzw. dein) Skript funktioniert ja auch so, es würde anders eben nur ein wenig schöner aussehen ;) (und es wäre einfacher für mich, Werte von Hand einzutragen)

    Grüße,
    stonie10
     
  6. a:3:{i:0;s:9:"Eintrag 1";i:1;s:15:"zweiter Eintrag";i:2;s:20:"und noch ein Eintrag";}
    die bedeutung ist ganz einfach:

    a:3: dein Array hat 3 einträge
    i:0;s9: dein Eintrag 0 ist 9 Zeichen lang
    "Eintrag 1" ist dein Wert

    der Rest klärt sich von selbst. Dein Array (a:3) ist mit { } eingeklammert.
    Es ist halt nur eine andere Darstellung eines arrays. serelize ist eine sehr schöne PHP-funktion, mit der man viele sinnvolle dinge machen kann.

    MFG

    Marcel
     
    stonie10 und (gelöschter Benutzer) gefällt das.
  7. Hobbes_

    Hobbes_ Gast

    Ich freue mich, dass es funktioniert. Hatte eben keine Möglichkeit es vorher zu testen.

    Du hast schon Recht. Die Datei sieht etwas ungewohnt aus und wurde bereits durch southpole2004 erklärt. Das liegt an der Funktion serialize(). Diese ist mit dem einfachen Speichern eines Arrays eigentlich unterfordert. Mit ihr kannst Du wesentlich kompliziertere Konstruktionen und auch Objekte speichern und dann wieder laden. Deshalb sind einige Meta-Informationen in der Datei gespeichert, die Du beim Lesen der Textdatei siehst.

    Wie oben bereits beschrieben gibt es verschiedene Möglichkeiten, die Daten zu speichern. Aufgrund der von Dir angegebenen Spezifikationen habe ich die einfachste und auch sehr flexible Variante mit serialize() gewählt. Andere Optionen sind
    • Manuelles Speichern des Arrays als Liste (Text): Bau beim Lesen und Speichern eine einfache Schleife ein, die entweder das Array ausliest und in eine Datei schreibt (Vorschlag 1 Item pro Zeile) und beim Lesen wieder in ein Array umwandelt. Alternativ kannst Du auch die Funktionen implode() und explode() interessant sein :) Probier mal folgende Ersetzungen (ach ja, dazu solltest Du einen neuen Dateinamen verwenden, da die beiden Dateitypen inkompatibel sind):
      Code:
      $test=unserialize(file_get_contents($array_filename));
      // dadurch ersetzen
      $test=explode("\n", file_get_contents($array_filename));
      
      //---------
      
      if(!@fwrite($f, serialize($test)))
      // dadurch ersetzen
      if(!@fwrite($f, implode("\n", $test)))
      
    • Gerade wenn du jedoch grösseres mit diesen Daten vorhast und sie später evtl noch sortieren oder andersweitig bearbeiten möchtest, empfehle ich eine frühzeitige Beschäftigung mit einer Datenbank (v.a. MySQL, die ebenso wunderbar aus PHP bedienbar ist). Damit machst Du gleich Nägel mit Köpfen, ohne später mühsam die Dateien umschreiben zu müssen oder andere probleme immer von Hand zu lösen (siehe unten).
    Bsp: je nach Workload Deiner Webseite könnte das Speichern und Lesen dieser Parameterdatei wie mit serialize() oder manuellem Array ein Problem darstellen. Ab einem gewissen Workload kann die Datei nicht mehr einfach so zum schreiben geöffnet werden, da sie durch einen anderen Aufruf des PHP-files gerade selbst geschrieben wird oder gelesen wird. Dann kommt es zu nicht immer voraussehbarem Verhalten der Seite und zu Datenverlust. Solche Dinge können Dir mit einer sauberen Datenbankimplementation nicht passieren. Alternativ kannst Du ein Lock/Unlock-System implementieren, wie es auch von Multitasking-Systemen angewandt wird :)

    Ein anderes Problem bei jeder Datenspeicherung ist die Sicherheit, die es zu beachten gilt: Wenn Du Benutzereingaben in irgendwelcher Form speicherst, so musst Du sicherstellen, dass sie weder für Deinen Server noch später für den Client bei der Ausgabe gefährlich sein können. Ein Lesen der Sicherheitsseiten auf php.net und einschlägigen Webseiten lohnt sich. eines der Stichworte ist das escapen von unerwünschten Zeichen :)

    Deshalb: Der obenstehende Vorschlag war nur ein kurzer funktionierender Start in die Welt des interaktiven Web-Projekts. Einiges - doch interessantes - kommt noch auf Dich zu... Viel Erfolg!
     
    #7 Hobbes_, 16.07.07
    Zuletzt von einem Moderator bearbeitet: 16.07.07
  8. stonie10

    stonie10 Welscher Taubenapfel

    Dabei seit:
    31.10.05
    Beiträge:
    760
    Danke euch beiden, soutphole2004 und psc :)

    @psc
    Wow, was soll ich sagen... geil :-D
    Ich werde mir deine Tipps zu Herzen nehmen und mal ein wenig damit "experimentieren" ;) Das mit dem multiplen Zugriff auf eine Datei dürfte bei meinem Skript im Moment noch kein Problem darstellen, da es wirklich nur ein Mini-Skript ist und das Array lediglich ein paar Zahlen beinhaltet :)

    Im Moment stehe ich aber noch recht am Anfang, was PHP angeht. Ich werde auf jeden Fall einmal versuchen, das ganze mit MySQL zu realisieren (zumal ich lokal alle notwendigen Komponenten besitze und auch ein PHP+MySQL Buch hier rumliegen habe). ;)

    Nochmal vielen Dank psc! :)

    Grüße,
    stonie10
     

Diese Seite empfehlen