Sinje: Array zufällig ausgeben und ausgegeben Werte merken

0 59

Array zufällig ausgeben und ausgegeben Werte merken

Sinje
  • php
  1. 0
    Siri
    • programmiertechnik
  2. 0
    Melvin Cowznofski
    1. 0
      Tom
      1. 0
        Tom
      2. 0
        Melvin Cowznofski
        1. 0
          Tom
    2. 0

      Glossar: "auskommentieren"

      Der Martin
      • programmiertechnik
      1. 0
        Matthias Apsel
    3. 0
      Matthias Apsel
      1. 0
        Melvin Cowznofski
  3. 0
    Tom
    1. 0
      Sinje
      1. 0
        Tom
  4. 0

    Ticken PHP-Programmierer anders?

    Siri
    1. 0
      Matthias Apsel
      1. 0
        Siri
        1. 0

          PHP tickt anders - wie eigentlich jede Programmiersprache

          dedlfix
          1. 0
            Siri
            1. 0
              dedlfix
    2. 0
      Tom
      1. 0
        Siri
        1. 0
          tami
          1. 0
            Tom
        2. 0
          Tom
          1. 0
            Sinje
            1. 0
              Tom
  5. 0
    Claudius L.
    1. 0
      tami
      1. 0
        Claudius L.
    2. 0
      Tom
      1. 0
        Tom
      2. 0
        Claudius L.
        1. 0
          Tom
          1. 0
            Claudius L.
            1. 0
              Tom
            2. 0
              tami
              1. 0
                tami
                1. 0

                  Wirksames File-Locking geht anders!

                  Tom
                  1. 0
                    tami
                    1. 0
                      Tom
                      1. 0
                        tami
                        1. 0

                          gehst Du eine Test-Wette mit mir ein?

                          Tom
                          • menschelei
                          1. 0
                            tami
                            1. 0

                              Und wer testet jetzt?

                              Tom
                              1. 0
                                tami
                                1. 0
                                  Tom
                                  1. 0
                                    Matthias Apsel
                                    1. 0

                                      neue Artikel anlegen, Namen finden

                                      Tom
                                      • selfhtml-wiki
                                      1. 0
                                        Matthias Apsel
                                        1. 0
                                          Tom
                                          1. 0
                                            Matthias Apsel
                                            1. 0
                                              tami
                                  2. 0

                                    Und wer testet jetzt? -> mit SQL?

                                    Gaby
                                    • datenbank
                                    1. 0
                                      Tom
              2. 0
                Tom
  6. 0

    Array zufällig ausgeben und ausgegeben Werte merken - so?

    tami
    1. 0
      Tom
  7. 1
    Tom

Hi,

die Array-Zufallsausgabe mache ich mit shuffle(), funktioniert auch gut beim jeweiligen Reload der Seite - so solle auch bei mir sein.

Möchte das Ganze aber so machen, dass die ausgegebenen Werte quasi erstmal aus dem Array verschwinden und erst dann wieder als mögliche Ausgabewerte zur Verfügung stehen, wenn alle Werte ausgegeben wurden.

D.h.

Array mit rot, grün, blau, schwarz

Shuffle-Ausgabe rot

Dann steht im Array nur noch grün, blau, schwarz

Shuffle-Ausgabe schwarz

Dann steht im Array nur noch grün, blau

usw.

Und wenns leer ist, fängt es von vorne an ;-)

Wie mache ich das am besten?

Liebe Grüsse, Die Sinje

  1. Hallo,

    Array mit rot, grün, blau, schwarz

    Shuffle-Ausgabe rot

    Dann steht im Array nur noch grün, blau, schwarz

    Shuffle-Ausgabe schwarz

    Dann steht im Array nur noch grün, blau

    usw.

    Und wenns leer ist, fängt es von vorne an ;-)

    Wie mache ich das am besten?

    Ich würde eine Methode schreiben, die die Zufallszahlen erzeugt (in deinem Fall 0-3) und in einer Liste nachschaut, ob die Zufallszahl schon erzeugt wurde, wenn ja, dann erzeuge die nächste und wenn eine freie erscheint, dann setze den Wert auf die Liste und benutze die Zufallszahl für die Ausgabe. Nach (in deinem Fall) 4 Ausgaben wird die List wieder geleert und das Spiel beginnt von vorne.

    Viele Grüße
    Siri

  2. Hallo Sinje,

    ich habe Dir, damit Du die Schritte verstehst, den Code Zeile für Zeile auskommentiert:

      
    <?php  
       // Das Array wird definiert:  
       $array = array('rot', 'grün', 'violett', 'blau', 'braun', 'rosa', 'gelb', 'schwarz', 'pink');  
       // Du willst das Array danach wieder zur Verfügung haben, deshalb legen wir ein "Backup" an:  
       $array_original = $array;  
       // Es wird solange gemischt und ein Arrayelement "gezogen", bis das Array leer ist:  
       for ( $i=0; $i<count($array_original); $i++ )  
          {  
             // Mischen:  
             shuffle($array);  
             // Zufällige Bestimmung eines der noch vorhandenen Arrayelemente:  
             $rand = rand(0, count($array)-1);  
             // Ausgabe dieses Arrayelements:  
             echo $array[$rand]."<br>";  
             // Damit es nicht noch mal ausgewählt wird, wird das Element aus dem Array entfernt:  
             unset($array[$rand]);  
          }  
       // Das Array soll, wenn es komplett leer ist, wieder in Originalform zur Verfügung setehen:  
       $array = $array_original;  
    ?>
    

    Mit lieben Grüßen

    Melvin Cowznofski

    --

    Melvin Cowznofski
    What – me worry?
    1. Hello,

      // Mischen:
               shuffle($array);
               // Zufällige Bestimmung eines der noch vorhandenen Arrayelemente:
               $rand = rand(0, count($array)-1);
               // Ausgabe dieses Arrayelements:
               echo $array[$rand]."<br>";

      Doppelt gemischt hält besser?

      Es würde reichen, solange bis $_alt leer ist:

        
          shuffle($_alt);  
          $element = array_pop($_alt);  
        
          $_neu[] = $element;  
        
          ausgabe($element)  
        
      
      

      Danach ist $_alt = $_neu und es kann von vorne losgehen.

      Muss nur noch die Frage geklärt werden, wie das von Roundturn zu Roundturn zwischengespeichert werden soll: für alle Besucher oder nur für einen bestimmten?

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
       ☻_
      /▌
      / \ Nur selber lernen macht schlau
      http://bikers-lodge.com
      1. Hello,

        Es würde reichen, solange bis $_alt leer ist:

        shuffle($_alt);
            $element = array_pop($_alt);

        $_neu[] = $element;

        ausgabe($element)

        
        >   
        > Danach ist $\_alt = $\_neu und es kann von vorne losgehen.  
          
        Aus taktischen Gründen ist es übrigens besser, array\_shift() zu benutzen anstelle von array\_pop(), also das Array quasi als FiFo-Speicher zu benutzen.  
          
        Zur Erklärung kommen wir dann, wenn wir später vielleicht noch die Grenzfälle diskutieren. Dazu muss sich der TO aber erst einmal zurückmelden :-)  
          
          
          
          
          
        Liebe Grüße aus dem schönen Oberharz  
          
          
        Tom vom Berg  
        ![](http://selfhtml.bitworks.de/Virencheck.gif)  
          
        
        -- 
         ☻\_  
        /▌  
        / \ Nur selber lernen macht schlau  
        <http://bikers-lodge.com>
        
      2. Hallo Tom,

        Doppelt gemischt hält besser?

        Damit habe ich schon gerechnet. Ja, das habe ich _absichtlich_ so gemacht. Ich empfinde einen Zufall als zufälliger, wenn er durch 2 Zufälle entsteht. *)

        Es würde reichen, solange bis $_alt leer ist:

        Das ist aus technischer Sicht natürlich richtig.

        Mit lieben Grüßen

        Melvin Cowznofski

        *) Ich lasse mir per PHP regelmäßig Lottozahlen, die ich dann auch spiele, vorschlagen. Dabei wird mein Lottokugel-Array vor jeder Ziehung sogar 7 Mal (!!) geshuffelt, bevor eine Zahl "gezogen" wird, weil 7 meine Glückszahl ist. =)

        --

        Melvin Cowznofski
        What – me worry?
        1. Hello,

          Doppelt gemischt hält besser?

          Damit habe ich schon gerechnet. Ja, das habe ich _absichtlich_ so gemacht. Ich empfinde einen Zufall als zufälliger, wenn er durch 2 Zufälle entsteht. *)

          Ob das die Mischgüte nicht sogar verringert, müssten wir jetzt mal die Wahrscheinlichkeitsverschwörungstheoriemathematiker fragen :-)

          Liebe Grüße aus dem schönen Oberharz

          Tom vom Berg

          --
           ☻_
          /▌
          / \ Nur selber lernen macht schlau
          http://bikers-lodge.com
    2. Hallo,

      ich habe Dir, damit Du die Schritte verstehst, den Code Zeile für Zeile auskommentiert:

      falsche und dadurch missverständliche Wortwahl. Unter "auskommentieren" versteht man eigentlich, Teile des Programmcodes in einen Kommentar zu verpacken, so dass er zwar im Quelltext noch lesbar, aber unwirksam ist.

      $val = 42;  
      // $val = GetNextNumber();  
      echo $val;
      

      In diesem (sinnlosen) Beispiel ist der Aufruf der Funktion GetNextNumber() vorübergehend _auskommentiert_ worden, um den Rest des Codes unabhängig von dieser Funktion mit bestimmten, fest vorgegebenen Daten zu testen.

      Ciao,
       Martin

      --
      Wissen erwirbt man, indem man immer das Kleingedruckte sorgfältig liest.
      Erfahrung bekommt man, indem man das nicht tut.
      Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
      1. Om nah hoo pez nyeetz, Der Martin!

        Unter "auskommentieren" versteht man …

        Ab jetzt auch im Wiki nachzulesen.

        Matthias

        --
        Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Fass und Fassade.

    3. Om nah hoo pez nyeetz, Melvin Cowznofski!

      $array = array('rot', 'grün', 'violett', 'blau', 'braun', 'rosa', 'gelb', 'schwarz', 'pink');

      $array_original = $array;
      for ( $i=0; $i<count($array_original); $i++ ) {
        shuffle($array);
        $rand = rand(0, count($array)-1);
        echo $array[$rand]."<br>";
        unset($array[$rand]);
      }
      $array = $array_original;

        
      ~~~php
      $array = array('rot', 'grün', 'violett', 'blau', 'braun', 'rosa', 'gelb', 'schwarz', 'pink');  
      $array_original = $array;  
      shuffle($array);  
      for ( $i=0; $i < count($array); $i++ ) {  
        echo $array[$i];  
      }
      

      leistet das Verlangte.

      Matthias

      --
      Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Lid und Lido.

      1. Hallo Matthias,

        diesen Beitrag hättest Du Dir sparen können, wenn Du vorher gelesen hättest, was ich schon gestern geschrieben habe. Mir ist völlig klar, dass es auch kürzer ginge.

        Mit lieben Grüßen

        Melvin Cowznofski

        --

        Melvin Cowznofski
        What – me worry?
  3. Hello,

    die Array-Zufallsausgabe mache ich mit shuffle(), funktioniert auch gut beim jeweiligen Reload der Seite - so solle auch bei mir sein.

    Möchte das Ganze aber so machen, dass die ausgegebenen Werte quasi erstmal aus dem Array verschwinden und erst dann wieder als mögliche Ausgabewerte zur Verfügung stehen, wenn alle Werte ausgegeben wurden.

    Da fehlt noch eine Angabe:
    Für WEN sollen die bereits gezogenen Werte aus dem Array verschwinden?

    Wir bewegen uns hier i.d.R. im Webumfeld, das heißt in einer konkurrierenden Umgebung. Es bewerben sich ggf. mehrere User um eine Ziehung.

    Erklär doch mal, wozu es gut sein soll, dann kann man Dir leichter weiterhelfen.

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bikers-lodge.com
    1. Hallo,

      na, da geht ja was ab hier ...

      Da fehlt noch eine Angabe:
      Für WEN sollen die bereits gezogenen Werte aus dem Array verschwinden?

      Stimmt, das hatte ich nicht ausdrücklich gesagt. Prinzipiell ist das für WEN egal, es geht um die Aufrufe, ich will nur vermeiden, dass bevor nicht alle Elemente einmal in zufälliger Reihenfolge ausgegeben wurden, ein Element doppelt ausgegeben wird. Dass dies nicht wirklich ein Zufallsprinzip ist, weiss ich auch ... denn da kommt es ja nur auf die Masse an.

      Möchte vermeiden, das der gleiche User, der z.B. alle paar Tage vorbeischaut, den Eindruck hat, dass es eine Regelmäßigkeit gibt.

      Liebe Grüsse, Sinne

      1. Hello,

        Da fehlt noch eine Angabe:
        Für WEN sollen die bereits gezogenen Werte aus dem Array verschwinden?

        Möchte vermeiden, das der gleiche User, der z.B. alle paar Tage vorbeischaut, den Eindruck hat, dass es eine Regelmäßigkeit gibt.

        Das sind wir schon einen Schritt weiter. Es geht also um denselben Client (nicht um den Gleichen). Der muss wiedererkannt werden und für ihn eine Statusdatei geführt werden. Die will dann aber eines Tages auch wieder entfernt werden, aber wie und wodruch?

        Somit haben wir eine Frage beantwortet und zwei neue aufgeworfen.

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        http://bikers-lodge.com
  4. Hallo,

    hier ist mir mal wieder aufgefallen, dass ich manchmal die Ansätze in den PHP-Antworten nicht so recht verstehe... Die von Tom und Melvin vorgeschlagenen Lösungen sind sehr pragmatisch und lösen auch das Problem.

    Allerdings habe ich bei der Fragestellung sofort ein Zufallsobjekt gesehen, welches ich mit einer Start- und Endrange instantiieren würde (Zufallszahlen zwischen x und y). In einer Liste werden die verbrauchten Zahlen gehalten, wenn die Liste "voll" ist, dann wird sie zurückgesetzt.
    Damit kann ich das Modul nicht nur für den beschriebenen Fall benutzen, sondern immer, wenn ich eine Zufallszahl nicht "doppelt" zurück bekommen möchte. Mein Ansatz hat jetzt weder Zustimmung noch Kritik bekommen.

    Denken "die" PHP-Programmierer eher "ausgaben- bzw. anzeigenorientiert"? ;-)

    Viele Grüße
    Siri

    1. Om nah hoo pez nyeetz, Siri!

      Allerdings habe ich bei der Fragestellung sofort ein Zufallsobjekt gesehen, welches ich mit einer Start- und Endrange instantiieren würde (Zufallszahlen zwischen x und y). In einer Liste werden die verbrauchten Zahlen gehalten, wenn die Liste "voll" ist, dann wird sie zurückgesetzt.
      Damit kann ich das Modul nicht nur für den beschriebenen Fall benutzen, sondern immer, wenn ich eine Zufallszahl nicht "doppelt" zurück bekommen möchte. Mein Ansatz hat jetzt weder Zustimmung noch Kritik bekommen.

      Ist es nicht ressourcenschonender, wenn man das Array nur ein einziges Mal mischt, dann nacheinander die Zahlen aus dem Array nimmt und, wenn man das letzte gezogen hat, neu mischt?

      Matthias

      --
      Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Frank und Frankfurt.

      1. Hallo,

        Ist es nicht ressourcenschonender, wenn man das Array nur ein einziges Mal mischt, dann nacheinander die Zahlen aus dem Array nimmt und, wenn man das letzte gezogen hat, neu mischt?

        Wie ist das "Ressourcenschonend" zu verstehen? Wird PHP zur Laufzeit kompiliert?

        Ich würde gar nicht auf die Idee kommen, einen Array zu mischen, sondern einen allgemeinen Ansatz bevorzugen, der das Problem "Sich-nicht-wiederholende-Zufallszahlen" löst.

        Viele Grüße
        Siri

        1. Tach!

          Wie ist das "Ressourcenschonend" zu verstehen? Wird PHP zur Laufzeit kompiliert?

          PHP wird in einen Bytecode kompiliert, der dann interpretierend ausgeführt wird, oder so ähnlich jedenfalls. Es wird jedenfalls nicht direkt Maschinencode erzeugt.

          Ich würde gar nicht auf die Idee kommen, einen Array zu mischen, sondern einen allgemeinen Ansatz bevorzugen, der das Problem "Sich-nicht-wiederholende-Zufallszahlen" löst.

          Natürlich kann man sich für alles Objekte basteln, beispielsweise. Aber warum diesen Aufwand treiben, wenn man hemdsärmlich die Möglichkeiten PHPs mit wenigen Zeilen nutzen kann?

          dedlfix.

          1. Hallo,

            Wie ist das "Ressourcenschonend" zu verstehen? Wird PHP zur Laufzeit kompiliert?

            PHP wird in einen Bytecode kompiliert, der dann interpretierend ausgeführt wird, oder so ähnlich jedenfalls. Es wird jedenfalls nicht direkt Maschinencode erzeugt.

            Ah, OK! Hatte das schon aus dem Lesen diverser Posts so vermutet...

            Ich würde gar nicht auf die Idee kommen, einen Array zu mischen, sondern einen allgemeinen Ansatz bevorzugen, der das Problem "Sich-nicht-wiederholende-Zufallszahlen" löst.

            Natürlich kann man sich für alles Objekte basteln, beispielsweise. Aber warum diesen Aufwand treiben, wenn man hemdsärmlich die Möglichkeiten PHPs mit wenigen Zeilen nutzen kann?

            Fehlt da ein <ironie></ironie> drumherum?
            Müssen ja nicht immer Objekte sein (hier hätte es sich angeboten), können ja auch Service- oder Utilklassen sein, aus denen dann Module und Bibliotheken entstehen. Aber ich nehme an, dass ich DIR das nicht erzählen muss.

            Hab halt nur öfters so einen "Hä?"-Effekt bei manchen PHP-Postings...

            Viele Grüße
            Siri

            1. Tach!

              Natürlich kann man sich für alles Objekte basteln, beispielsweise. Aber warum diesen Aufwand treiben, wenn man hemdsärmlich die Möglichkeiten PHPs mit wenigen Zeilen nutzen kann?

              Fehlt da ein <ironie></ironie> drumherum?

              Nein. PHP ist keine objektorientierte Sprache. Man kann Objekte verwenden und auch ganze OOP-Frameworks aufziehen. Die OOP ist aber weiterhin eine Dreingabe, und man muss trotzdem sehr viel Nicht-OOP verwenden. Wenn man sich zu sehr vom Grundgedanken PHPs entfernt, hat man am Ende vielleicht nur einen Haufen Code (für Wrapper und den, um die Prinzipien anderer Sprachen/Frameworks nachzubauen) und eine lange Ausführzeit.

              PHPs Array (zusammen mit den Array-Funktionen) ist eine wunderbar einfache und vielseitige Struktur. Anderswo nimmt man für jeden Anwendungsfall (List, Dictionary, Queue, ...) eine spezialisierte Klasse. Kann man auch in PHP nachbilden, muss aber nicht sein - nicht in jedem Fall zumindest.

              dedlfix.

    2. Hello,

      hier ist mir mal wieder aufgefallen, dass ich manchmal die Ansätze in den PHP-Antworten nicht so recht verstehe... Die von Tom und Melvin vorgeschlagenen Lösungen sind sehr pragmatisch und lösen auch das Problem.

      Dein Problem ist zumindest noch nicht endgültig gelöst, maximal zu einem Fünftel bisher.

      PHP-Programmierer, also solche die PHP tatsächlich für die Client-Server-Programmierung im Web einsetzen, denken immer auch an die Dimension Zeit und die Unstetigkeiten in der Zeitachse. Diese erzeugen Requestdoppelungen, Race-Conditions, Kapselung/Vereinzelung von Programmabläufen usw.

      Die Werkzeuge, die PHP bietet, sind teilweise sehr mächtig, teilweise aber leider auch subtil und unvollständig. Man muss sich eben immer die passenden raussuchen.

      Ich wäre begeistert, wenn wir auch diesen Thread zu einem wirklichen Ziel bringen könnten. Dazu müsstet Du allerdings weiter mitarbeiten, sonst macht das keinen Spaß :-)

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
       ☻_
      /▌
      / \ Nur selber lernen macht schlau
      http://bikers-lodge.com
      1. Hallo,

        Ich wäre begeistert, wenn wir auch diesen Thread zu einem wirklichen Ziel bringen könnten. Dazu müsstet Du allerdings weiter mitarbeiten, sonst macht das keinen Spaß :-)

        Schau, ich kann aufgrund des Codes nicht mal beurteilen, dass es noch gar nicht gelöst ist! ;-)
        Was ist denn noch offen?

        Viele Grüße
        Siri

        1. hi,

          Hallo,

          Ich wäre begeistert, wenn wir auch diesen Thread zu einem wirklichen Ziel bringen könnten. Dazu müsstet Du allerdings weiter mitarbeiten, sonst macht das keinen Spaß :-)

          Schau, ich kann aufgrund des Codes nicht mal beurteilen, dass es noch gar nicht gelöst ist! ;-)
          Was ist denn noch offen?

          Garnix: https://forum.selfhtml.org/?t=217369&m=1492961

          Ich denke aber, dass man mit PHP einfach das macht, was PHP kann und anbietet und fertig. Ich würde es noch twas anders machen:

            
          <?php  
          $myColors = array("blau", "rot", "grün", "schwarz");  
          $myColorsToShuffle = $myColors;  
          shuffle($myColorsToShuffle);  
          foreach ($myColorsToShuffle as $color) {  
          	echo $color ."\n";  
          }
          

          Wenns anders gewollt ist, kann man natürlich noch array_shift() einbauen, fragt sich nur, wozu das nützlich sein soll ...;

          mfg

          tami

          1. Hello,

            Schau, ich kann aufgrund des Codes nicht mal beurteilen, dass es noch gar nicht gelöst ist! ;-)
            Was ist denn noch offen?

            Garnix: https://forum.selfhtml.org/?t=217369&m=1492961

            Wie kommst Du rauf, dass nichts mehr fehlt?

            Das ist doch bisher nur die Hälfte einer unausgereiften Grundidee ohne jegliche Implementation in den Kontext. Das Stichwort "merken" sollte dich aufmerken lassen :-)

            Liebe Grüße aus dem schönen Oberharz

            Tom vom Berg

            --
             ☻_
            /▌
            / \ Nur selber lernen macht schlau
            http://bikers-lodge.com
        2. Hello,

          Schau, ich kann aufgrund des Codes nicht mal beurteilen, dass es noch gar nicht gelöst ist! ;-)
          Was ist denn noch offen?

          * Wieviele Extraktionen sollen vorgenommen werden pro Request?
          * Soll es ein Multiuser-System sein oder bezieht sich das "schon gezogen" nur auf einen User?
            Stichworte: Session, Datenbank, gemeinsame Ressource-Datei, Round-Turns, Abort-Festigkeit, ...

          * Wie müssen die Daten zwischen den Requests zwischengespeichert werden?
            Stichworte: Race-Condition, Serialisierung, TOCTTOU, ...
          * Grenzwertbetrachtungen:
            - Was passiert, wenn das Array schon "leer" ist, aber die
              vorgeschriebene Anzahl von Extraktionen noch nicht erreicht ist?
            Stichworte: array_shift() contra array_pop()

          Nebenbetrachtungen:
          * Warum "shuffle()" und nicht "rand()"?
          * Was soll passieren, wenn die vorgeschriebene Anzahl Extraktionen größer ist, als
            die vorhandene Anzahl Array-Elemente?
          * Wie wird das Subsystem (das hier entsteht) installiert?

          Bevor ich mir Gedanken über OOP oder Objekte oder Pragmen mache, kläre ich doch erstmal die grundlegenden Fragen. Anschließend kann ich das Problem dann bezüglich der gewählten Programmiertechnik weiter aufblasen.

          Liebe Grüße aus dem schönen Oberharz

          Tom vom Berg

          --
           ☻_
          /▌
          / \ Nur selber lernen macht schlau
          http://bikers-lodge.com
          1. Hallo nochmal,

            * Wieviele Extraktionen sollen vorgenommen werden pro Request?

            immer eine Extraktion pro Aufruf der Seite und zwar soll das Element extrahiert werden, welches ausgegeben wurde ..

            * Soll es ein Multiuser-System sein oder bezieht sich das "schon gezogen" nur auf einen User?

            Wohl auch verschiedene User, kommen ja auf der Website an ...

            Stichworte: Session, Datenbank, gemeinsame Ressource-Datei, Round-Turns, Abort-Festigkeit, ...

            Hatte schon an eine Textdatei/Logfile gedacht, in den ich die angezeigten Elemente packe. Die Elemente, die sich dann darin befinden, werden vor dem Shuffle() aus dem Array entfernt ... das Ganze solange - also bei jedem Aufruf, bis kein Element mehr im Array ist und dann wird das Array neu gefüllt.

            Liebe Grüsse, Sinje

            1. Hello,

              Hallo nochmal,

              * Wieviele Extraktionen sollen vorgenommen werden pro Request?

              immer eine Extraktion pro Aufruf der Seite und zwar soll das Element extrahiert werden, welches ausgegeben wurde ..

              Ja, das Ganze ist eine Extraction, inclusive der Ausgabe.

              * Soll es ein Multiuser-System sein oder bezieht sich das "schon gezogen" nur auf einen User?

              Wohl auch verschiedene User, kommen ja auf der Website an ...

              Da schreibst Du aber hier https://forum.selfhtml.org/?t=217369&m=1492989 genau das Gegenteil. Entscheide dich einfach :-)

              Stichworte: Session, Datenbank, gemeinsame Ressource-Datei, Round-Turns, Abort-Festigkeit,

              Hatte schon an eine Textdatei/Logfile gedacht, in den ich die angezeigten Elemente packe. Die Elemente, die sich dann darin befinden, werden vor dem Shuffle() aus dem Array entfernt ... das Ganze solange - also bei jedem Aufruf, bis kein Element mehr im Array ist und dann wird das Array neu gefüllt.

              Eine "Textdatei", ich möchte sie hier eher "Datendatei" nennen, da sie nur schwer human readable sein wird, ist für die persistente Speicherung ok, solange sie nicht zu groß wird. Sie sollte dann die beiden Arrays in serialisierter Form enthalten. Da schaust Du dir am besten mal "serialize" & Co, an http://de2.php.net/manual/en/function.serialize.php

              Wenn immer nur ein Element gezogen werden soll, fallen ja schon mal ein paar der lästigen Grenzwertbetrachtungen weg. Das vereinfacht die Sache.

              Ggf. könnte man dann aber auch rand() und unset() benutzen. Das ist dann etwas billiger als shuffle(). Aber man verbaut/verschlechtert sich damit die Möglichkeit der Weiterentwicklung für mehrere Elemente pro Request.

              Liebe Grüße aus dem schönen Oberharz

              Tom vom Berg

              --
               ☻_
              /▌
              / \ Nur selber lernen macht schlau
              http://bikers-lodge.com
  5. Hallo,

    es gibt zwar schon einige Antworten, allerdings verstehe ich die Frage etwas anders.
    Ich denke, pro Request soll 1 zufälliges Element (z.B. eine Farbe) ausgegeben werden. Beim nächsten Request sollen bereits ausgegebene Elemente nicht mehr zufällig gewählt werden können. Wurde jedes Element ein Mal ausgegeben, wird neu gemischt und es geht von vorne los.

    In Code könnte das etwa so aussehen (ungetestet!) – nur als Konzept und ohne Fehlerbehandlung:

    $farben = array("rot", "gruen", "blau", "schwarz");  
      
    $indices_serialized = file_get_contents("indices_serialized.txt"); // oder anders persistent speichern bzw. laden  
      
    if (count($indices_serialized) == 0 || !is_array($indices_serialized)) { // jedes Element wurde bereits ein Mal ODER: Skript lief noch nie, indices_serialized.txt enthält nur ""  
    	$indices_serialized = array_keys($farben); // alle Keys stehen ab jetzt wieder als Index zur Verfuegung  
    	shuffle($indices_serialized);  
    }  
      
      
    echo $farben[array_pop($indices_serialized)];  
      
    file_put_contents("indices_serialized.txt", serialize($indices_serialized));  
    
    

    Es gibt eine Race-Condition, wenn das Skript parallel aufgerufen wird – ob das für den Anwendungsfall tragisch wäre, muss der TO bewerten.

    Viele Grüße
    Claudius

    1. hi,

      »»» $indices_serialized = file_get_contents("indices_serialized.txt"); // oder anders persistent speichern bzw. laden

      fehlt da nicht ein unserialize?

      mfg

      tami

      1. Hallo tami,

        fehlt da nicht ein unserialize?

        absolut. ;)
        Und vielleicht auch noch mehr – ich muss mir dringend mal wieder einen Server zum Testen installieren …

        Viele Grüße
        Claudius

    2. Hello,

      Es gibt eine Race-Condition, wenn das Skript parallel aufgerufen wird – ob das für den Anwendungsfall tragisch wäre, muss der TO bewerten.

      Naja, durch die Race-Condition kann das File zerstört werden. Das halte ich schon für tragisch.

      File_get_contents() und file_put_contents() halte ich für datenverändernde Vorgänge im Konkurrenz-Umfeld für wenig bis gar nicht geeignet. Man kann dann zwar wieder auf äußerst komplizierte Art einen "Kontext" als Funktionsargument mitgeben, aber warum so verklausuliert, wenn es mit Grundfunktionen sauber und nachvollziebar funktioniert.

      Und die Abort-Festigkeit ist auch noch nicht hergestellt.

      Und warum nicht beide Arrays in der Datendatei ablegen? Man kann sie ja als Subarray in ein gemeinsames einbetten, dann bleibt es einfach.

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
       ☻_
      /▌
      / \ Nur selber lernen macht schlau
      http://bikers-lodge.com
      1. Hello,

        ich präzisiere das nochmal:

        File_get_contents() und file_put_contents() _sind_ für datenverändernde Vorgänge im Konkurrenz-Umfeld völlig ungeeignet, da man mit ihnen das TOCTTOU-Problem nicht beseitigen kann.

        Für die Datenveränderung muss der gesamte Vorgang

        • Datei öffnen
        • Datei lesen
        • Datei ändern
        • Datei schreiben
        • Datei schließen

        atomar abgehandelt werden, also die Datei bereits vor dem Lesen gegen Veränderung gesperrt werden. Hält man den Vorgang kompakt, reicht ein LOCK_EX nach dem Öffnen.

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        http://bikers-lodge.com
      2. Hallo Tom,

        Naja, durch die Race-Condition kann das File zerstört werden. Das halte ich schon für tragisch.

        Wie? Ich sehe die Möglichkeit, dass in der Datei das Falsche steht: Da die Änderung des ersten Skripts durch die des zweiten Skripts überschrieben werden kann, kann die erste Änderung verloren gehen. Dies kann dazu führen, dass ein Element „zu früh“ (vor Ausgabe aller anderer Elemente) nochmals ausgegeben wird. Das sehe ich ein, darauf habe ich hingewiesen, ebenso wie darauf, dass der TO wissen muss, ob da schlimm ist. Ich denke nein, wenn es nur darum geht, beim Besucher den „Eindruck einer Regelmäßigkeit“ zu vermeiden. Wie wahrscheinlich das Problem überhaupt ist, ist eine Frage der Anzahl der Seitenaufrufe.

        Wie kann die Datei zerstört werden?

        Und die Abort-Festigkeit ist auch noch nicht hergestellt.

        Ist die hier notwendig? Wie stellst du sie dir vor? Kannst du ein Szenario beschreiben?

        Und warum nicht beide Arrays in der Datendatei ablegen? Man kann sie ja als Subarray in ein gemeinsames einbetten, dann bleibt es einfach.

        Ich fand es unnötig unübersichtlich. Das statische Array mit den Daten kann im PHP-Skript stehen oder sonstwoher kommen. Es gibt keinen Grund, es mit in die Datei zu schreiben.

        Viele Grüße
        Claudius

        1. Hello,

          Naja, durch die Race-Condition kann das File zerstört werden. Das halte ich schon für tragisch.

          Wie?

          Indem schon gelesen wird, während noch geschrieben wird.

          Liebe Grüße aus dem schönen Oberharz

          Tom vom Berg

          --
           ☻_
          /▌
          / \ Nur selber lernen macht schlau
          http://bikers-lodge.com
          1. Hallo Tom,

            Indem schon gelesen wird, während noch geschrieben wird.

            Falls das geschehen sollte, passiert allerdings auch nichts „Schlimmes“. Notfalls ergibt das unserialize() false und es wird ein neues Array erzeugt.
            Wie gesagt, solange es nicht extrem viele Zugriffe gibt, ist dieser Fall sehr unwahrscheinlich. Die einzige Konsequenz ist eine etwas zufälligere Ausgabe der Werte (da „zu früh“ neu gemischt wird). Das scheint mir im Anwendungsfall des TO laut dessen Beschreibung völlig unkritisch.

            Du hast ja im Prinzip Recht, allerdings habe ich bei deinen Argumentationen öfters das Gefühl, dass du so sehr auf Details achtest, dass Fortschritt in der Sache schwierig wird. (Ich beziehe mich damit nicht nur auf diesen Thread.)

            Viele Grüße
            Claudius

            1. Hello Claudius,

              Du hast ja im Prinzip Recht, allerdings habe ich bei deinen Argumentationen öfters das Gefühl, dass du so sehr auf Details achtest, dass Fortschritt in der Sache schwierig wird. (Ich beziehe mich damit nicht nur auf diesen Thread.)

              Ich achte auf alle Details, die mir selber bekannt sind. Das nennt man dann auch "gewissenhafte Programmierung".

              PHP macht einem die aber nicht gerade leicht, da es vor Jahren schlampig begonnen wurde und dann schon so weit verbereitet war, dass man sich wohl nicht getraut hat, die konzeptionellen Fehler mit einem Neubeginn zu beseitigen.

              Liebe Grüße aus dem schönen Oberharz

              Tom vom Berg

              --
               ☻_
              /▌
              / \ Nur selber lernen macht schlau
              http://bikers-lodge.com
            2. hi,

              Hallo Tom,

              Indem schon gelesen wird, während noch geschrieben wird.

              Falls das geschehen sollte, passiert allerdings auch nichts „Schlimmes“. Notfalls ergibt das unserialize() false und es wird ein neues Array erzeugt.
              Wie gesagt, solange es nicht extrem viele Zugriffe gibt, ist dieser Fall sehr unwahrscheinlich. Die einzige Konsequenz ist eine etwas zufälligere Ausgabe der Werte (da „zu früh“ neu gemischt wird). Das scheint mir im Anwendungsfall des TO laut dessen Beschreibung völlig unkritisch.

              Du hast ja im Prinzip Recht, allerdings habe ich bei deinen Argumentationen öfters das Gefühl, dass du so sehr auf Details achtest, dass Fortschritt in der Sache schwierig wird. (Ich beziehe mich damit nicht nur auf diesen Thread.)

              http://forum.de.selfhtml.org/archiv/2013/3/t213253/

              dedlfix: "file_get_contents() und file_put_contents() erledigt den Zugriff in einem Rutsch. Für das Schreiben kennt file_put_contents() auch ein Flag, das die Sperre setzt."

              mfg

              tami

              1. hi,

                hi,

                Hallo Tom,

                Indem schon gelesen wird, während noch geschrieben wird.

                Falls das geschehen sollte, passiert allerdings auch nichts „Schlimmes“. Notfalls ergibt das unserialize() false und es wird ein neues Array erzeugt.
                Wie gesagt, solange es nicht extrem viele Zugriffe gibt, ist dieser Fall sehr unwahrscheinlich. Die einzige Konsequenz ist eine etwas zufälligere Ausgabe der Werte (da „zu früh“ neu gemischt wird). Das scheint mir im Anwendungsfall des TO laut dessen Beschreibung völlig unkritisch.

                Du hast ja im Prinzip Recht, allerdings habe ich bei deinen Argumentationen öfters das Gefühl, dass du so sehr auf Details achtest, dass Fortschritt in der Sache schwierig wird. (Ich beziehe mich damit nicht nur auf diesen Thread.)

                http://forum.de.selfhtml.org/archiv/2013/3/t213253/

                dedlfix: "file_get_contents() und file_put_contents() erledigt den Zugriff in einem Rutsch. Für das Schreiben kennt file_put_contents() auch ein Flag, das die Sperre setzt."

                http://www.php.net/manual/en/function.file-put-contents.php

                "LOCK_EX Acquire an exclusive lock on the file while proceeding to the writing. "

                mfg

                tami

                1. Hello,

                  http://www.php.net/manual/en/function.file-put-contents.php

                  "LOCK_EX Acquire an exclusive lock on the file while proceeding to the writing. "

                  Das ist aber zu wenig!

                  Die Sperre gegen Veränderung muss vor dem Lesen gesetzt werden und darf erst nach dem Schreiben und flushen wieder aufgehoben werden!

                  Wie oft muss ich das eigentlich noch runterbeten?

                  Liebe Grüße aus dem schönen Oberharz

                  Tom vom Berg

                  --
                   ☻_
                  /▌
                  / \ Nur selber lernen macht schlau
                  http://bikers-lodge.com
                  1. hi,

                    Hello,

                    http://www.php.net/manual/en/function.file-put-contents.php

                    "LOCK_EX Acquire an exclusive lock on the file while proceeding to the writing. "

                    Das ist aber zu wenig!

                    Die Sperre gegen Veränderung muss vor dem Lesen gesetzt werden und darf erst nach dem Schreiben und flushen wieder aufgehoben werden!

                    Wie oft muss ich das eigentlich noch runterbeten?

                    Das hängt doch von dem Zusammenhang ab. Wenn es für jeden User einen Farbfile gibt, hast Du das Problem überhaupt nicht. Ggfs. kommt dann doch alles aus einer Datenbank ...;

                    Zudem bezweifle ich aus rein praktischen Gründen, dass Du bei einem Schreibvorgang von 50 oder 100 Byte in eine Datei noch einen Lesevorgang dazwischen geschoben bekommst vom Betriebssystem. Und selbst wenn, kann man im Lesevorgang vermerken, dass - wenn das serialisierte Ding geschrotet sein soll - er einfach nochmal lesen soll, nach einem kurzen Timeout.

                    Die Frage ist ja auch, was man sich dann im worst-case für einen Fehler einhandelt. Dass doch zweimal rot kommt, obwohl man das nicht wollte?

                    mfg

                    tami

                    1. Hello,

                      Zudem bezweifle ich aus rein praktischen Gründen, dass Du bei einem Schreibvorgang von 50 oder 100 Byte in eine Datei noch einen Lesevorgang dazwischen geschoben bekommst vom Betriebssystem.

                      Das hängt erstmal davon ab, wie groß der Buffer definiert wurde auf der atomistischen Ebene, also nicht in der Hochsprache, sondern der API-Funktion des Filesystems. Bufferoperationen werden immer geschlossen abgwickelt, aber um 100 Bytes zu schreiben, könnte man schon zwei Schreibzyklen benötigen.

                      Das Wissen, dass es möglich ist, einfach zu missachten, ist schlimmer, als nur Faulheit, zumal man dem Missstand ja mit den paar passenden Zeilen entgegen wirken kann.

                      Und solange hier solche Thesen vertreten werden, macht es mir absolut keinen Spaß, mich mit OOP  in PHP, riesig aufgeblasenen Klassen, Design-Patterns, Callback Functions, und sonst irgend welchem Trödel auseinanderzusetzen.

                      Nur weil man in der Theorie weit über 700 neue Begriffe erfunden hat, muss man nicht die Grundlagen der technischen Informatik missachten!

                      Die Frage ist ja auch, was man sich dann im worst-case für einen Fehler einhandelt. Dass doch zweimal rot kommt, obwohl man das nicht wollte?

                      Darum geht es nicht. Es werden Techniken und "Best Practices" verbreitet, die absolut jeder Gewissenhaftigkeit entbehren. Man erzieht sich damit zur Schlampigkeit. Diese verursacht/ermöglicht dann Löcher in den Systemen und ermöglicht NSA-Zugriffe, BEAST, Heartbleed, thorn, etc...

                      Liebe Grüße aus dem schönen Oberharz

                      Tom vom Berg

                      --
                       ☻_
                      /▌
                      / \ Nur selber lernen macht schlau
                      http://bikers-lodge.com
                      1. hi,

                        Hello,

                        Zudem bezweifle ich aus rein praktischen Gründen, dass Du bei einem Schreibvorgang von 50 oder 100 Byte in eine Datei noch einen Lesevorgang dazwischen geschoben bekommst vom Betriebssystem.

                        Das hängt erstmal davon ab, wie groß der Buffer definiert wurde auf der atomistischen Ebene, also nicht in der Hochsprache, sondern der API-Funktion des Filesystems. Bufferoperationen werden immer geschlossen abgwickelt, aber um 100 Bytes zu schreiben, könnte man schon zwei Schreibzyklen benötigen.

                        Jo, zum testen der Geschäftslogik reicht das ja erstmal. U.u. sogar für den Betrieb.

                        Das Wissen, dass es möglich ist, einfach zu missachten, ist schlimmer, als nur Faulheit, zumal man dem Missstand ja mit den paar passenden Zeilen entgegen wirken kann.

                        Das hat mit Faulheit nix zu tun. Das ist eine Abwägung von Zeiteinsatz und Nutzen. Und die "paar" Zeilen erübrigen sich u.U. sowieso, wenn man das Lesen und Schreiben dem "Objekt" überlässt, dass dafür zuständig ist, nämlich den Datenbankserver oder der eigenen FileHandling-Klasse.

                        Und solange hier solche Thesen vertreten werden, macht es mir absolut keinen Spaß, mich mit OOP  in PHP, riesig aufgeblasenen Klassen, Design-Patterns, Callback Functions, und sonst irgend welchem Trödel auseinanderzusetzen.

                        Nur weil man in der Theorie weit über 700 neue Begriffe erfunden hat, muss man nicht die Grundlagen der technischen Informatik missachten!

                        OOP heißt in dem Fall einfach, dass ich eine Klasse bau, damit ich nicht den "global space" "pollute". So wie ich es gemacht habe. Mit privaten und öffentlichen Methoden.

                        Die Frage ist ja auch, was man sich dann im worst-case für einen Fehler einhandelt. Dass doch zweimal rot kommt, obwohl man das nicht wollte?

                        Darum geht es nicht. Es werden Techniken und "Best Practices" verbreitet, die absolut jeder Gewissenhaftigkeit entbehren. Man erzieht sich damit zur Schlampigkeit. Diese verursacht/ermöglicht dann Löcher in den Systemen und ermöglicht NSA-Zugriffe, BEAST, Heartbleed, thorn, etc...

                        Das sind hier zwei paar Schuhe. Die logische Aufgabe zu erfüllen ist eine (Klasse). Sich ums sichere Schreiben zu kümmern eine andere. Ich könnte dann in der read oder write Methode der Color-Klasse einfach TomsSecure::write() aufrufen, oder TomsSecure::read() - wenn es denn eine solche gäbe. Vielleicht macht es auch mehr Sinn, eine Instanz dieser Klasse zu haben, und keine statischen Funktionen. Und damit ist dann auch schon Sinn und Zweck und Vorteil von "OOP" erklärt. Mehr gibts da m.E. in der "Theorie" auch nicht. Wie das dann professionell funktioniert, kann man sich in ZendFramework oder YUI (für Javascript) und vermutlich "100.000" anderen anschauen.

                        mfg

                        tami

                        1. Hello,

                          Das hat mit Faulheit nix zu tun. Das ist eine Abwägung von Zeiteinsatz und Nutzen. Und die "paar" Zeilen erübrigen sich u.U. sowieso, wenn man das Lesen und Schreiben dem "Objekt" überlässt, dass dafür zuständig ist, nämlich den Datenbankserver oder der eigenen FileHandling-Klasse.

                          Dann wirst Du also nie zu denjenigen gehören, die sichere Objekte (Klassen) oder File-Handling-Schnittstellen für Dartenbanken erstellen können.

                          Das finde ich schade. Man baut doch kein Haus auf einem morschen Fundament!

                          Bei der Datenbank wird das ja noch viel spannender. Da wird von Transaktionen geschwafelt, ohne sich überhaupt klar zu machen, dass die Lücke in Webanwendungen meistens im zeitversetzen Zugriff besteht. Und da liegt zwischen dem Lesen und dem Schreiben meistens mindestens ain Roundturn mit Milliarden von Taktzyklen Pause! Und die anderen User schlafen auch nicht.

                          Früher hat SelfHTML mal von drei Prinzipien gelebt:

                          • Die Kraft des Verstehens
                          • Hilfe zum Selbermachen
                          • Into the Depth

                          In diesem Thread ging es nun um eine ganz einfache Aufgabenstellung, die man sehr schön dazu benutzen konnte zu zeigen:

                          • wie man Aufgabenstellungen verallgemeinern kann und mMn auch muss

                          • wie man daraus entstehenden Code wiederverwendbar macht für ähnliche,
                              aber unterschiedliche Einsatzzwecke

                          • Wie man Code und seine Grunddaten pflegbar/konfigurierbar macht

                          • welche Fallstricke (Grenzfälle) bestehen und wie man die behandeln kann

                          • was "Multi-User-Umgebung" bedeutet

                          • welche mächtigen Funktionen PHP besitzt und wie man die für sich einsetzt

                          • welche Funktionen in PHP nahezu unbrauchbar sind, weil sie von Idioten
                              oder vom NSA entworfen worden sind
                              Die sind nur für "quick & dirty" benutznbar, aber nicht für den Produktivbetrieb!

                          • wie man selbst in PHP against all odds noch Fehlerbehandlung betreiben kann

                          • wie eine verständliche, leicht benutzbare und für diverse Einsatzzwecke taugliche
                              Lösung erzeugt werden kann
                              (ich habe extra wieder den Allman-Style und die explizite Schreibweise benutzt!)

                          • und wahrscheinlich habe ich noch viele Punkte vergessen!

                          Tami, ich bin jetzt enttäuscht von Dir. Du bist manchmal so besonnen, aber warum bockst Du jetzt hier?

                          Versuch doch besser mal, deine Klasse für einen Wettbewerb fit zu machen. Wenn Du fertig bist, teste ich deine Klasse und Du testest meine Funktion mit ihren Voreinstellungen, wie benutzerfest sie sind. Ist das fair? Ich finde ja.

                          Müssen wir nur noch einen Preis ausloben und jemand finden, der die Wetten annimmt, wer mehr Fehler findet.

                          Liebe Grüße aus dem schönen Oberharz

                          Tom vom Berg

                          --
                           ☻_
                          /▌
                          / \ Nur selber lernen macht schlau
                          http://bikers-lodge.com
                          1. hi,

                            naja, wer hier wirklich was von PHP versteht, weil "täglich Brot" ist wohl Sven ...;

                            mfg

                            tami

                            1. Hello,

                              naja, wer hier wirklich was von PHP versteht, weil "täglich Brot" ist wohl Sven ...;

                              Und wer baut dann das Beispiel als Klasse?
                              Und wer testet die beiden Lösungen dann?

                              *schnüff*

                              Liebe Grüße aus dem schönen Oberharz

                              Tom vom Berg

                              --
                               ☻_
                              /▌
                              / \ Nur selber lernen macht schlau
                              http://bikers-lodge.com
                              1. hi,

                                Hello,

                                naja, wer hier wirklich was von PHP versteht, weil "täglich Brot" ist wohl Sven ...;

                                Und wer baut dann das Beispiel als Klasse?
                                Und wer testet die beiden Lösungen dann?

                                *schnüff*

                                Nun ja, die Klasse ist ja eigentlich nur ein "wrapper". Und ein paar $this-> müssen noch dazu.

                                Und dann kommt in meine Klasse ein Aufruf beim Schreiben und Lesen auf Deine Klasse, und wenn jemand mal was anderes schreiben und lesen will, kann er Deine Klasse auch nutzen, auch wenn das garnix mit Colors zu tun hat. Und schon ist das ganze geheimnis um "OOP" (eigentlich ja eher KOP - Klassen-orientiertes-Programmieren) gelüftet ...;

                                mfg

                                tami

                                1. Hello,

                                  Nun ja, die Klasse ist ja eigentlich nur ein "wrapper". Und ein paar $this-> müssen noch dazu.

                                  Und dann kommt in meine Klasse ein Aufruf beim Schreiben und Lesen auf Deine Klasse, und wenn jemand mal was anderes schreiben und lesen will, kann er Deine Klasse auch nutzen, auch wenn das garnix mit Colors zu tun hat. Und schon ist das ganze geheimnis um "OOP" (eigentlich ja eher KOP - Klassen-orientiertes-Programmieren) gelüftet ...;

                                  Ich habe ja nur eine Funktion geschrieben.
                                  Ich hatte gehofft, dass Du deine Klasse noch mal mit den richtigen[tm] Dateifunktionen und einer Fehlerbehandlung bestücken könntest (try catch) und wir dann aus diesem Beispiel einen Artikel zur Fehlerbehandlung entwickeln könnten.

                                  Ich sammele für die prozedurale Welt schon mal die Fehlermeldungen von PHP.
                                  Wer welöche findet, kann sie mir senden, bitte mit Text, in welchem Kontext sie aufgetreten sind.

                                  mailto:tom.vom.berg@online.de?subject=php-errors

                                  Ich habe schon mal ein Beispiel ins Wiki gestellt. Das muss formattechnisch noch überarbeitet werden und bedarf noch einer ausführlichen Funktionsbeschreibung. Leider habe ich beim Titel erzeugen wohl 'was falsch gemacht. Wäre toll, wenn das jemand richtig stellen könnte und mir beibringt, wie es richtig geht :-)

                                  http://wiki.selfhtml.org/wiki/Artikel:PHP/"Changer"_%3D_Wechsellogik_für_Banner,_Farben,_Bilder,_o._ä.#Ausprobieren

                                  Liebe Grüße aus dem schönen Oberharz

                                  Tom vom Berg

                                  --
                                   ☻_
                                  /▌
                                  / \ Nur selber lernen macht schlau
                                  http://bikers-lodge.com
                                  1. Om nah hoo pez nyeetz, Tom!

                                    Ich habe schon mal ein Beispiel ins Wiki gestellt. Das muss formattechnisch noch überarbeitet werden und bedarf noch einer ausführlichen Funktionsbeschreibung. Leider habe ich beim Titel erzeugen wohl 'was falsch gemacht. Wäre toll, wenn das jemand richtig stellen könnte und mir beibringt, wie es richtig geht :-)

                                    Naklar. ;-)

                                    Wie soll der Artikel denn heißen? „PHP/"Changer" = Wechsellogik für Banner, Farben, Bilder, o. ä.“ finde ich nicht so passend.

                                    http://wiki.selfhtml.org/wiki/Artikel:PHP/"Changer"_%3D_Wechsellogik_für_Banner,_Farben,_Bilder,_o._ä.#Ausprobieren

                                    Matthias

                                    --
                                    Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Pluto und Plutonium.

                                    1. Hello,

                                      Wie soll der Artikel denn heißen? „PHP/"Changer" = Wechsellogik für Banner, Farben, Bilder, o. ä.“ finde ich nicht so passend.

                                      http://wiki.selfhtml.org/wiki/Artikel:PHP/"Changer"_%3D_Wechsellogik_für_Banner,_Farben,_Bilder,_o._ä.#Ausprobieren

                                      Na jedenfalls kriege ich das "PHP/" vor dem Titel nicht mehr weg. Das ist irgendwie missverständlich, wie der Artikel heißen wird, wenn man in der Übersicht eine Überschrift hinzufügt.

                                      Wonach würde man bei Google & Co denn suchen, wenn man eine solche Lösung benötigt?

                                      "Changer" ist ja ein üblicher Begriff, aber immer in Zusammensetzung:

                                      "Color-Changer", "Image-Changer", usw.

                                      Liebe Grüße aus dem schönen Oberharz

                                      Tom vom Berg

                                      --
                                       ☻_
                                      /▌
                                      / \ Nur selber lernen macht schlau
                                      http://bikers-lodge.com
                                      1. Om nah hoo pez nyeetz, Tom!

                                        Na jedenfalls kriege ich das "PHP/" vor dem Titel nicht mehr weg. Das ist irgendwie missverständlich, wie der Artikel heißen wird, wenn man in der Übersicht eine Überschrift hinzufügt.

                                        * Styleswitcher - serverseitig, komfortabel
                                        * Wechsellogik für Inhalte von Websiten

                                        Das beste ist, du erstellst solche Artikel in deinem Benutzernamensraum und wenn der Artikel fertig ist, wird er an seinen endgültigen Platz verschoben.

                                        Wonach würde man bei Google & Co denn suchen, wenn man eine solche Lösung benötigt?

                                        selfhtml

                                        Matthias

                                        --
                                        Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Sex und Sextant.

                                        1. Hello,

                                          Na jedenfalls kriege ich das "PHP/" vor dem Titel nicht mehr weg. Das ist irgendwie missverständlich, wie der Artikel heißen wird, wenn man in der Übersicht eine Überschrift hinzufügt.

                                          * Styleswitcher - serverseitig, komfortabel
                                          * Wechsellogik für Inhalte von Websiten

                                          Eigentlich würde es mir fürs erste reichen, wenn Du bei der Artikelüberschrift das "PHP/" beseitigen würdest. Ich denke mir dann noch eine bessere Überschrift aus, bzw. recherchiere in den Suchmaschinen nach der Aufgabenstellung.

                                          "Styleswitcher" finde ich als Teil vom Honeypot aber schon mal gut.

                                          Die Logik hinter Eintrag im Inhaltsverzeichnis und wie daraus eine Überschrift entsteht habe ich noch nicht durchschaut.

                                          Liebe Grüße aus dem schönen Oberharz

                                          Tom vom Berg

                                          --
                                           ☻_
                                          /▌
                                          / \ Nur selber lernen macht schlau
                                          http://bikers-lodge.com
                                          1. Om nah hoo pez nyeetz, Tom!

                                            Eigentlich würde es mir fürs erste reichen, wenn Du bei der Artikelüberschrift das "PHP/" beseitigen würdest. Ich denke mir dann noch eine bessere Überschrift aus, bzw. recherchiere in den Suchmaschinen nach der Aufgabenstellung.

                                            Er heißt jetzt Changer - Wechsellogik für Banner, Farben, Bilder, o. ä.

                                            Die Logik hinter Eintrag im Inhaltsverzeichnis und wie daraus eine Überschrift entsteht habe ich noch nicht durchschaut.

                                            = h1 =, das bitte nicht verwenden, das ist die Artikelüberschrift, die so heißt wie der Dateiname. Die taucht nicht im Inhaltsverzeichnis auf.

                                            == h2 ==
                                            === h3 ===

                                            sind dann Überschriften, die auch im TOC auftauchen, Es lässt sich beeinflussen, bis zu welcher Tiefe die Überschriften im TOC erscheinen sollen.

                                            Matthias

                                            --
                                            Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Ara und Araber.

                                            1. hi,

                                              es ist ja eigentlich ein shuffler, oder? der memorized, und zwar serialisiert. also eigentlich ein SerializedShuffleMemorizer.

                                                
                                              <?php  
                                              /**  
                                              * Saves List in serialized File an picks new Item every call until End, then shuffles new.  
                                              */  
                                              class MemorizedShuffle  
                                              {  
                                                  private $_serFileName = "";  
                                                  private $_toShuffle = "";  
                                                  private $_shuffled = array();  
                                                  private $_nextItem = "";  
                                                  /**  
                                                   * Constructor  
                                                   *@param string filename, array List to Shuffle  
                                                   * @return void  
                                                   */  
                                                  public function __construct($serFileName, $toShuffle) {  
                                                  $this->_serFileName = $serFileName;  
                                                      $this->_toShuffle = $toShuffle;  
                                                      if(!file_exists($this->_serFileName)) {  
                                                          $this->_createNewShuffledFile();  
                                                      }  
                                                      $this->_read();  
                                                  }  
                                                  private function _createNewShuffledFile() {  
                                                      $this->_shuffled = $this->_toShuffle;  
                                                      shuffle($this->_shuffled);  
                                                      $this->_write();  
                                                  }  
                                                  private function _write() {  
                                                      if (false === file_put_contents($this->_serFileName, serialize($this->_shuffled))) {  
                                                      throw new Exception ("Could not write");  
                                                  };  
                                                  }  
                                                  private function _read() {  
                                                      $this->_shuffled = unserialize(file_get_contents($this->_serFileName));  
                                                  if (false === $this->_shuffled) {  
                                                      throw new Exception ("Could not read");  
                                                  }  
                                                  }  
                                                  public function getNext() {  
                                                      //~ var_dump($this->_shuffled);  
                                                      if (count($this->_shuffled) === 0) {  
                                                          $this->_createNewShuffledFile();  
                                                      }  
                                                      $actualItem = array_shift($this->_shuffled);  
                                                      $this->_write();  
                                                      return $actualItem;  
                                                  }  
                                              };  
                                              $myShuffler = new MemorizedShuffle("ColorsShuffled.ser", array("blau", "rot", "grün", "schwarz"));  
                                              var_dump($myShuffler->getNext());  
                                                
                                              
                                              

                                              mfg

                                              tami

                                  2. Hallo,

                                    Ich habe schon mal ein Beispiel ins Wiki gestellt. Das muss formattechnisch noch überarbeitet werden und bedarf noch einer ausführlichen Funktionsbeschreibung. Leider habe ich beim Titel erzeugen wohl 'was falsch gemacht. Wäre toll, wenn das jemand richtig stellen könnte und mir beibringt, wie es richtig geht :-)

                                    Das Wiki habe ich gelesen und nutze es auch ... alles bestens.

                                    Hast Du auch eine Idee, wie ich das für meine SQL-Abfrage nutzen kann?

                                    Da habe ich das gleiche Problem - lasse mir mit LIMIT 1 und RAND() einen Eintrag ausgeben, der den status = 1 hat (entsprechende Einträge habe ich vorher markiert).
                                    Hätte das auch gerne so wie in der Array-Version, dass der ausgegeben Eintrag solange nicht mehr zur Verfügung steht bei der Zufalls Ausgabe, bis alle noch zur Verfügung stehenden Einträge einsmal angezeigt wurden. Dann das Ganze wieder von vorne.

                                    So sieht meine Abfrage aus:

                                      
                                    //Cookie setzten, damit gleiche Einträge nicht nacheinander angezeigt werden  
                                    if (!isset($_COOKIE['lastSnipplet']))  
                                    {  
                                       $_COOKIE['lastONE']=-1;  
                                    }  
                                      
                                    //Abfrage  
                                    $query = "SELECT * FROM meinetabelle WHERE id != '".$_COOKIE['lastSnipplet']."' AND status = '1'  ORDER BY RAND() LIMIT 1";  
                                    $result = mysql_query($query,$conn);  
                                    $row = mysql_fetch_array ($result);  
                                      
                                    setcookie('lastONE',$row["id"]);  
                                      
                                    
                                    

                                    DANKE, die Gaby!

                                    1. Hello,

                                      mit der Datenbank wird es etwas schwieriger.

                                      Da müsstest Du eine zweite Tabelle (B) mit den Bewegungsdaten - welche DS aus (A) habe ich schon ausgegeben? - führen und diese dann in einer Ausschlussabfrage aus dem Select ausklammern, also im Freitext:

                                      Finde A.ID für Bedingung X in A für die gilt, dass select B.A_ID = NULL

                                      Und wenn keine mehr gefunden wird, werden die Daten in B gelöscht, ggf. auch nur die für einen speuiellen User, falls Du differenzieren willst.

                                      Liebe Grüße aus dem schönen Oberharz

                                      Tom vom Berg

                                      --
                                       ☻_
                                      /▌
                                      / \ Nur selber lernen macht schlau
                                      http://bikers-lodge.com
              2. Hello,

                http://forum.de.selfhtml.org/archiv/2013/3/t213253/

                dedlfix: "file_get_contents() und file_put_contents() erledigt den Zugriff in einem Rutsch. Für das Schreiben kennt file_put_contents() auch ein Flag, das die Sperre setzt."

                Das ist aber leider falsch gesperrt!

                File_get_contents() und file_put_contents() lassen sich nicht zu einem atomaren Vorgang zusammenfassen, da sie namensbasierte Funktionen sind. Atomare Kapselung von Lese- und Schreibvorgang, so wie sie hier notwendig ist, geht bei den heute üblichen Filesystemen (seit Erfindung der Festplatte für den PC) nur mit Handle-basierten Funktionen.

                Leider hat Christian Seiler seinen Artikel über das File-Locking ja verstümmelt. Die Vorgängerversion war klarer und vollständiger.

                Liebe Grüße aus dem schönen Oberharz

                Tom vom Berg

                --
                 ☻_
                /▌
                / \ Nur selber lernen macht schlau
                http://bikers-lodge.com
  6. hi,

      
    <?php  
    class Colors  
    {  
        private $_serFileName = "myColorsShuffled.ser";  
        private $_colors = array("blau", "rot", "grün", "schwarz");  
        private $_colorsShuffled = array();  
        private $_nextColor = "";  
        public function __construct() {  
            if(!file_exists($this->_serFileName)) {  
                $this->_createNewShuffledFile();  
            }  
            $this->_read();  
        }  
        private function _createNewShuffledFile() {  
            $this->_colorsShuffled = $this->_colors;  
            shuffle($this->_colorsShuffled);  
            $this->_write();  
        }  
        private function _write() {  
            file_put_contents($this->_serFileName, serialize($this->_colorsShuffled));  
        }  
        private function _read() {  
            $this->_colorsShuffled = unserialize(file_get_contents($this->_serFileName));  
        }  
        public function getNext() {  
            //~ var_dump($this->_colorsShuffled);  
            if (count($this->_colorsShuffled) === 0) {  
                $this->_createNewShuffledFile();  
            }  
            $actualColor = array_shift($this->_colorsShuffled);  
            $this->_write();  
            return $actualColor;  
        }  
    };  
    $myColors = new Colors();  
    echo $myColors->getNext();  
    
    

    Sollte "funzen". ggfs. mal das Var_dump() wieder einkommentieren ...;

    mfg

    tami

    1. Hello,

      <?php
      class Colors
      {
          private $_serFileName = "myColorsShuffled.ser";

      ***** Warum die Farben hart codieren in der Klasse?
      ***** besser wäre es, sie ebenfalls im Datenfile zu halten.
      ***** sie sind ja nicht "gottgegeben", wie "Ja/Nein", Monatsliste (in einer Sprache), usw.

      private $_colors = array("blau", "rot", "grün", "schwarz");

      private $_colorsShuffled = array();
          private $_nextColor = "";

      public function __construct() {
              if(!file_exists($this->_serFileName)) {

      ***** Tocttou-Fehler! *****

      $this->_createNewShuffledFile();

      ***** Verstümmelungsgefahr *****

      }
              $this->_read();
          }
          private function _createNewShuffledFile() {
              $this->_colorsShuffled = $this->_colors;
              shuffle($this->_colorsShuffled);
              $this->_write();
          }

      ***** Tocttou-Fehler! ******

      private function _write() {
              file_put_contents($this->_serFileName, serialize($this->_colorsShuffled));
          }
          private function _read() {
              $this->_colorsShuffled = unserialize(file_get_contents($this->_serFileName));

      ***** fehlende Fehlerbehandlung. unserialize() könnte false liefern.
      ***** file_get_contents() könnte auch schon einen Fehler werfen und false liefern

      }

      ***** file_put_contents() und file_get_contents() lassen sich nicht atomar binden
      ***** sind daher ungeeignet für datenverändernde Operationen im Konkurrenz-Umfeld

      public function getNext() {
              //~ var_dump($this->_colorsShuffled);
              if (count($this->_colorsShuffled) === 0) {
                  $this->_createNewShuffledFile();
              }
              $actualColor = array_shift($this->_colorsShuffled);
              $this->_write();
              return $actualColor;
          }
      };

      $myColors = new Colors();
      echo $myColors->getNext();

        
        
      Geschachtelte Funktionen sind "i-bäh", wenn man eigentlich diskrete Fehlerbehandlung betreiben muss, also die Fehler von Funktionen einzeln auswerten muss, weil sie ggf. reparierbar sind.  
        
        
        
        
        
      Liebe Grüße aus dem schönen Oberharz  
        
        
      Tom vom Berg  
      ![](http://selfhtml.bitworks.de/Virencheck.gif)  
        
      
      -- 
       ☻\_  
      /▌  
      / \ Nur selber lernen macht schlau  
      <http://bikers-lodge.com>
      
  7. Hello Sinje,

    nachdem Tamni so fleißig war und ich ihm Kommentare in seine Lösung geschrieben habe, kommt von mir jetzt auch noch eine, um Kommentare oder Fragen reinschreiben zu lassen.

    Ich habe gleich mal ausprobiert, wie man eine aussagefähige Fehlerbehandlung aufbauen könnte.

      
    <?php   ### changer.php ### Wechselnde Ausgabe ### utf-8 ### ÄÖÜäöü  
      
    ### only for testing  
    header('Content-Type: text/html; Charset=utf-8');  
    $filename = 'changer.dat';	## Dateiname für die Datendatei  
      
      
    #------------------------------------------------------------------------------  
    ## settings  
    #------------------------------------------------------------------------------  
    	$MYERRORMSG = NULL;			     ## Globale Variable zur Fehlerauswertung  
    	ini_set('track_errors',1);       ## Für die Fehlerbehandlung notwendig  
    	$abort = ignore_user_abort(true);## Damit das File fertig geschrieben wird  
                                         ##   wenn der User vorher schlapp macht.	  
      
    #------------------------------------------------------------------------------  
    function get_error_msg($error_txt)  
    {  
    	## ToDo:  
    	## für alle verfügbaren $php_errormsg eindeutige Fehlernummern festlegen  
      
    	return $error_txt;  
    }  
      
    #------------------------------------------------------------------------------  
    function changer($filename, $number=1)  
    {  
        GLOBAL $MYERRORMSG;  
      
        $fp = @fopen($filename, 'rb+');  
    	if (!$fp)  
    	{  
    		$MYERRORMSG = get_error_msg($php_errormsg);  
    		return false;  
    	}  
    	  
    	if (!@flock($fp, LOCK_EX))  
    	{  
    		$MYERRORMSG = get_error_msg($php_errormsg);  
    		return false;  
    	}  
    	  
    	$filesize = filesize($filename);  
    	$cont = fread($fp, $filesize);  
    	  
    	$_data = @parse_ini_string($cont, true);  
    	if ($_data === false)  
    	{  
    		$MYERRORMSG = "1000 - Fehler beim Parsen der Datenquelle $filename: $php_errormsg";  
    		return false;  
    	}  
    	  
    	  
    	if (!isset($_data['active'], $_data['reserve']))  
    	{  
    		$MYERRORMSG = '1010 - allg. Fehler in der Datenquelle';  
    		return false;  
    	}  
    	  
    	if (count($_data['active']) === 0  && count($_data['reserve']) === 0)  
    	{  
    		$MYERRORMSG = '1011 - Datenquelle ist leer';  
    		return false;  
    	}  
    	  
    	if (count($_data['active']) + count($_data['reserve']) < $number)  
    	{  
    		$MYERRORMSG = '1012 - Datenquelle enthält zuwenig Daten';  
    		return false;  
    	}  
      
    	$_selection = array();  
    	$shuffle_flag = false;  
    	  
    	for ($i = 0; $i < $number; $i++)  
    	{  
    		if (count($_data['active']) === 0)  
    		{  
    			$_data['active'] = $_data['reserve'];  
    			## reserve-Array wieder leeren  
    			$_data['reserve'] = array();  
    			$shuffle_flag = true;  
    		}  
    		$shift = array_shift($_data['active']);  
    		$_selection[] = $shift;  
    		$_data['reserve'][] = $shift;  
    	}  
      
    	## erst hier mischen, weil sonst in $_selection Einträge mehrmals auftreten könnten  
    	if ($shuffle_flag)  
    	{  
    		shuffle($_data['active']);	  
    		shuffle($_data['reserve']);	  
    	}	  
    	  
        ftruncate ($fp, 0);	  
    	fseek($fp, 0, SEEK_SET);  
    	fwrite ($fp, ';### ' . basename($filename) . ' ### ' . date('Y-m-d H:i:s') . ' ### utf-8 ### ÄÖÜäöü' . PHP_EOL);  
      
        fwrite ($fp, '[active]' . PHP_EOL);  
    	foreach($_data['active'] as $key => $value)  
    	{  
    	    fwrite ($fp, "$key = $value" . PHP_EOL);  
    	}  
    	  
        fwrite ($fp, PHP_EOL . '[reserve]' . PHP_EOL);  
    	foreach($_data['reserve'] as $key => $value)  
    	{  
    	    fwrite ($fp, "$key = $value" . PHP_EOL);  
    	}  
      
    	fclose($fp);   ## ich vertraue hier auf das OS. PHP ist zu doof dazu  
                           ## dass der Lock beim Schließen aufgehoben wird	  
                           ## und voher die Buffers geschrieben wurden  
        return $_selection;  
    }  
      
    #==============================================================================  
    # php unit test  
    #==============================================================================  
      
    echo "<pre>\r\n";  
    echo htmlspecialchars(print_r(changer($filename,3),1)) . "\r\n";  
    echo $MYERRORMSG . "\r\n";  
    echo "</pre>\r\n";  
      
    ?>  
    
    

    Und zum Testen ein Datenfile, damit Ihr das nicht selber eintippen müsst :-P

      
    ;### changer.dat ### 2014-05-09 16:21:00 ### utf-8 ### ÄÖÜäöü  
    [active]  
    0 = 'schwarz'  
    1 = 'braun'  
    2 = 'rot'  
    3 = 'orange'  
    4 = 'gelb'  
    5 = 'grün'  
    6 = 'blau'  
    7 = 'violett'  
    8 = 'grau'  
    9 = 'weiß'  
    10 = 'gold'  
    11 = 'silber'  
      
    [reserve]  
      
    
    

    Ob man damit nun Werbebanner durchtickert oder Farben oder News-Dateien, ist der Ini-Datei egal. Ich habe extra keine serialized Arrays benutzt, weil man so ganz einfach die Datei mit einem Editor füttern kann.

    Wenn wir die letzten Fehler noch gefunden haben, machen wir einen kleinen Artikel fürs Wiki daraus, mit ordentlich viel Kommentaren und Fragen und Antworten versehen bitte.

    Wenn Tami noch Lust dazu hat, können wir ja die überarbeitete Klasse daneben stellen. Dann haben alle 'was davon.

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bikers-lodge.com