Ankündigung

Einklappen
Keine Ankündigung bisher.

Ierator-Klassen und Ihr Zweck

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Ierator-Klassen und Ihr Zweck

    Welche Zweck haben Iteratoren-Klassen und was machen diese Klassen anders oder besser als eine Schleife?
    Wie setz man diese sinnvoll ein?

    bitcoin.de <- Meine Freelancerwährung

  • #2
    Wenn eine Klasse das Iterator Interface implementiert, dann kann man über diese iterieren. Du kannst damit also steuern, welche Items verwendet werden, wenn man die Klasse bsp. in einem ForEach verwendet.

    http://php.net/manual/de/class.iterator.php

    Kommentar


    • #3
      Folgendes Beispiel hatte ich seinerzeit mal gepostet:

      PHP-Code:
      <?php
      /**
       * @author kaminbausatz
       * 2017-07-19
       */
       
      class myTable extends RecursiveIteratorIterator {
          public 
      $myList '';
          public 
      $colCount 1;
          public 
      $playerCols 4;

          public function 
      beginIteration(){
              
      $this->myList .= '<table>';
          }
          public function 
      endIteration(){
              
      $this->myList .= '</table>';
          }
          public function 
      beginChildren() {
               if (
      $this->getDepth()==2)
                  
      $this->colCount=1;  
          }   
          public function 
      endChildren() {
                if (
      $this->getDepth()==2){
                  
      $this->myList.= str_repeat('<td>'$this->playerCols-$this->colCount+1);
               }    
          }
          public function 
      nextElement() {
              if (
      $this->getDepth()==0)
                  
      $this->myList .= '<tr><td colspan="'.($this->playerCols+1).'" class="fat">'.$this->key();

              if (
      $this->getDepth()==1)
                  
      $this->myList .= '<tr><td class="kursiv">'.$this->key();    

              if (
      $this->getDepth()==2){
                  
      $this->myList .= '<td>'.$this->current(); 
                  if (
      $this->colCount%$this->playerCols==0){
                      
      $this->colCount=0;
                      
      $this->myList .= '<tr><td>';
                     }
                  
      $this->colCount++;
               }          
          }

      $sqlCreate = <<<ENDSQL
      CREATE TABLE spieler (id INTEGER PRIMARY KEY, ort TEXT, team TEXT, spieler TEXT);
      INSERT INTO spieler (ort, team, spieler) VALUES 
      ('Berlin', 'Team A', 'Thomas'), ('Hamburg', 'Team B', 'Peter'), ('Hamburg', 'Team B', 'Hans'),
      ('Hamburg', 'Team B', 'Andreas'),('Hamburg', 'Team C', 'Hans'),('Frankfurt', 'Team D', 'Ben'),
      ('Frankfurt', 'Team D', 'Paul'),('Frankfurt', 'Team D', 'Jonas'),('Frankfurt', 'Team D', 'Felix'),
      ('Frankfurt', 'Team D', 'Emil'),('Frankfurt', 'Team D', 'Max');
      ENDSQL;

      $memDB = new PDO('sqlite::memory:');
      $memDB->exec($sqlCreate);
      $result $memDB->query('SELECT * FROM spieler ORDER BY team, spieler');
      foreach(
      $result as $row){
          
      $tableArray[$row['ort']][$row['team']][] = $row['spieler'];
      }
      $myTableHTML = new myTable(new RecursiveArrayIterator($tableArray), RecursiveIteratorIterator::SELF_FIRST);  
      foreach(
      $myTableHTML as $key => $list_element);
      ?>
      <!doctype html>
      <html lang="en">
      <head>
        <meta charset="UTF-8">
        <title>Document</title>
        <style>
        table {
          border-collapse: collapse;
          font-family: "Calibri", sans-serif;
        }
        table td {
          border: 1px solid #ccc; 
          width: 100px;
        }
        .fat{
          font-weight:bold;
        }
        .kursiv{
              font-style: italic;
        }
        </style>
      </head>
      <body>
      <?php echo $myTableHTML->myList?>
      </body>
      </html>

      Kommentar


      • #4
        Schaut sehr unübersichtlich aus. Ich würde , wenn , dann per DOMDocument oder so die Teilen der Tabelle einfügen.
        bitcoin.de <- Meine Freelancerwährung

        Kommentar


        • #5
          Weil das doppelt so viel Zeichen sind, weil man extra Ressourcen zum instanziieren und halten der Klassen braucht, oder weil man zusätzlich noch DOMDocument lernen muss, statt einfach HTML zu schreiben? Template-Engine hätte ich ja verstanden, aber DOMDocument? Wo liegt da der Vorteil?
          [I]You know, my wife sometimes looks at me strangely. „Duncan“, she says, „there's more to life than Solaris“. Frankly, it's like she speaks another language. I mean, the words make sense individually, but put them together and it's complete nonsense.[/I]

          Kommentar


          • #6
            Zitat von Alpha Beitrag anzeigen
            Schaut sehr unübersichtlich aus.
            Es ging um den Iterator... Was ist daran unübersichtlich.

            Zeige mal ein Beispiel wie Deine Lösung aussieht die das gleiche Ergebnis produziert.

            Unbenannt-1.png

            Kommentar


            • #7
              Zitat von kaminbausatz Beitrag anzeigen
              Zeige mal ein Beispiel wie Deine Lösung aussieht die das gleiche Ergebnis produziert.

              Mit Twig würde das so aussehen (https://twigfiddle.com/z62pm0):

              HTML-Code:
              <table>
                <tbody>
              
                  {% for city in cities %}
              
                    <tr>
                      <th class='city-label' colspan='5'>
                        {{ city.name }}
                      </th>
                    </tr>
              
                    {% for team in teamsByCity[city.id] %}
                      {% set totalPlayers = playersByTeam[team.id] | length %}
              
                      <tr>
                        <td class='team-label'>
                          {{ team.name }}
                        </td>
              
                      {% for player in playersByTeam[team.id] %}
              
                        <td>
                          {{ player }}
                        </td>
              
                        <!-- break rows after every 4th player -->
                        {% if loop.index != totalPlayers and (loop.index + 1) % 5 == 0 %}
                          </tr><tr><td></td>
                        {% endif %}
              
                      {% endfor %}
              
                      <!-- fill up with empty cells -->
                      {% if totalPlayers % 4 != 0 %}
                        {% for i in range(1, 4 - (totalPlayers % 4)) %}
                          <td></td>
                        {% endfor %}
                      {% endif %}
              
                      </tr>
                    {% endfor %}
              
                  {% endfor %}
              
                </tbody>
              </table>
              Hier das Ergebnis: https://jsfiddle.net/7ndp8Lhf/.

              Dein Iterator-Beispiel ist imho ziemlich konfus. Es ist schwer zu erfassen was das Ding überhaupt produziert. Ich finde die Lösung ehrlich gesagt hässlich weil das Markup in der Klasse steckt und somit nur ein ganz spezifisches Ergebnis ausspucken kann.

              Wünsche dennoch einen guten Rutsch!
              [SIZE="1"]Atwood's Law: any application that can be written in JavaScript, will eventually be written in JavaScript.[/SIZE]

              Kommentar


              • #8
                Zitat von lottikarotti Beitrag anzeigen

                Wünsche dennoch einen guten Rutsch!
                Ebenfalls alles Gute im neuen Jahr, hier ging es nicht um die Frage ob man was besser oder schlechter machen kann sondern darum was man mit den Iterator Klassen machen kann. Ob ich nun genau für diese Anwendung einTwig Template erstelle oder mal eben eine Klasse missbrauche ist Geschmackssache. Das Beispiel ist einem anderen Thread entnommen,

                Kommentar


                • #9
                  Zitat von kaminbausatz Beitrag anzeigen
                  Ebenfalls alles Gute im neuen Jahr
                  Danke

                  Zitat von kaminbausatz Beitrag anzeigen
                  hier ging es nicht um die Frage ob man was besser oder schlechter machen kann sondern darum was man mit den Iterator Klassen machen kann.
                  Nein, dem TE geht es darum zu verstehen welchen Zweck Iterator-Klassen haben und welche Unterschiede oder Vorteile sie gegenüber einer gewöhnlichen Schleife bieten. Zusätzlich wollte der TE einen *sinnvollen* Einsatzzweck als Beispiel haben - dafür eignet sich dein Beispiel eben *nicht*, weil es, wie du ja selbst sagtest, "mal eben eine Klasse [missbraucht]" und imho sogar ein Contra-Beispiel ist.

                  Iteratoren eigenen sich u.A. ziemlich gut dafür um komplexe und / oder performance-kritische Iterationen (bspw. mit Buffering-Mechanismen, Lazy-Loading o.ä.) wiederverwendbar zu abstrahieren. Bezogen auf dein Beispiel könnte man also einen Iterator implementieren, der es ermöglicht ein Array gruppiert (nach einem oder mehreren beliebigen Kriterien) zu durchlaufen. Darauf basierend kann dann bspw. das Rendering einer HTML-Tabelle oder der Export in einem beliebigen Datenformat implementiert werden.

                  In den meisten Fällen sind Generatoren aber die simplere Lösung. Hier ein Artikel (Vergleich) aus der PHP-Dokumentation:
                  - Comparing generators with Iterator objects

                  [SIZE="1"]Atwood's Law: any application that can be written in JavaScript, will eventually be written in JavaScript.[/SIZE]

                  Kommentar


                  • #10
                    Zitat von Alpha Beitrag anzeigen
                    Welche Zweck haben Iteratoren-Klassen und was machen diese Klassen anders oder besser als eine Schleife?
                    Iterator-Klassen unterstützen Schleifenkonstrukte. Ohne Schleifen wie foreach kann ich mir die die Nutzung von Iteratorklassen nicht vorstellen.
                    Der Vorteil von Iteratoren liegt wohl in erster Linie in seiner universellen Verwendbarkeit. Wenn das Konzept einmal verinnerlicht wurde kann es für viele Anwendungsfälle benutzt werden.
                    In diesen Sinne sind Anwendungen mit Iteratoren weder anders noch besser als eine Schleife, nur das Innere einer Schleife wird einfacher.
                    Viele Klassen haben ein Iteratorinterface implementiert und wir benutzen dies oft unbewusst.

                    Kommentar


                    • #11
                      Ich weiss das Ihr meine Fragen mögt. Aber ich denk mal die Antworten reichen mir erstmal. Danke.
                      Werd mich da durchwühlen bevor ich euch wieder mit neuen Unwissen quäle. ^^
                      bitcoin.de <- Meine Freelancerwährung

                      Kommentar

                      Lädt...
                      X