Miko: Array, Foreach

Hallo

Ich brauche von einem Array die Jahren und möchte es gerne in Blöcke ausgeben, sprich 1 Block gleich 5 Jahre

mein array sieht z.b so aus

  
$array = array(2011, 2010, 2009, 2008, 2007, 2006, 2005, 2004, 2003, 2002, 2001, 2000);  
  
foreach ($array as &$value) {  
   echo $value;  
}  

jetzt wie kann ich am besten das so ausgeben, das ich so ein div habe?

  
<div>2011,2010,2009,2008,2007</div>  
<div>2006,2005,2004,2003,2002</div>  
<div>2001,2000</div>  

würde mich freuen
vielen dank miko

  1. foreach ($array as &$value) {

    Gibts einen Grund, warum du hier eine Referenz verwendest?

    jetzt wie kann ich am besten das so ausgeben, das ich so ein div habe?

    In einer Schleife ausgeben, den aktuellen Index+1 modulo 5 nehmen und schaun obs einen Rest gibt - wenns keinen Rest gibt, neues div-Element anfangen.

    1. Hi,

      In einer Schleife ausgeben, den aktuellen Index+1 modulo 5 nehmen und schaun obs einen Rest gibt - wenns keinen Rest gibt, neues div-Element anfangen.

      Warum nicht Index modulo 4?
      Wäre voll viel performanter!!!11

      ~dave

      1. Warum nicht Index modulo 4?
        Wäre voll viel performanter!!!11

        Kannst du mir ein kleines beispiel geben
        ich versteh das nicht ganz

        1. Hallo Miko,

          der Modulo-Operator ist ein arithmetischer Operator. Er gibt den Rest bei einer ganzzahligen Division zurück.

          Warum nicht Index modulo 4?
          Wäre voll viel performanter!!!11

          wie gesagt, ist das einfach falsch und liefert nicht das gewünschte Ergebnis.

          Kannst du mir ein kleines beispiel geben
          ich versteh das nicht ganz

          Du solltest zuallererst statt

          foreach ($array as &$value) {  
             echo $value;  
          }
          

          Dein Array mit

          foreach ($array as $key => $value) {  
              # $key enthält nun den Index des jeweiligen Elementes  
              # Verfahre, wie suit vorgeschlagen hat.  
          }  
          
          

          durchlaufen.

          Frage bitte konkret nach, wenn Du etwas nicht verstanden hast.

          Freundliche Grüße

          Vinzenz

          1. $arr = array(2011, 2010, 2009, 2008, 2007, 2006, 2005, 2004, 2003, 2002, 2001, 2000);  
            foreach ($arr as $key => $value) {  
               $newkey = $key+1;  
               if($newkey % 5 == 0) {  
                               echo '<div>'.$value.'</div>';  
               } else {  
                               echo $value;  
               }  
            }
            

            So bekomme ich beim if ein jahr und unten 4.
            die trennung stimmt schonmal, aber wie bekomme ich den alle 5 jetzt in einem div?

            1. $newkey = $key+1;
                 if($newkey % 5 == 0) {

              du kannst auch gleich ($key+1)%5 notieren - die zwischenvariable "$newkey" ist unnötig

              So bekomme ich beim if ein jahr und unten 4.

              So hast du es auch programmiert :)

              die trennung stimmt schonmal, aber wie bekomme ich den alle 5 jetzt in einem div?

              Wenn das Array mindestens 1 Element hat mache ein div-Element auf, dann lass die schleife durchlaufen - wenn die Bedingung zutrifft mach das div-Element zu und gleich wieder auf - nach der Schleife machst du das verbleibende offene div-Element wieder zu.

              1. Hallo,

                du kannst auch gleich ($key+1)%5 notieren - die zwischenvariable "$newkey" ist unnötig

                [...]

                Wenn das Array mindestens 1 Element hat mache ein div-Element auf, dann lass die schleife durchlaufen - wenn die Bedingung zutrifft mach das div-Element zu und gleich wieder auf - nach der Schleife machst du das verbleibende offene div-Element wieder zu.

                aller guten Dinge sind drei :-)

                Freundliche Grüße

                Vinzenz

      2. Hallo,

        In einer Schleife ausgeben, den aktuellen Index+1 modulo 5 nehmen und schaun obs einen Rest gibt - wenns keinen Rest gibt, neues div-Element anfangen.

        Warum nicht Index modulo 4?
        Wäre voll viel performanter!!!11

        aber nicht das gewünschte :-(

        Wenn Du modulo 4 rechnest, bekommst Du eben genau 4 Zahlen je div-Element, der OP will aber 5. Will man 5, so nimmt man modulo 5 :D

        Freundliche Grüße

        Vinzenz

    2.   
      $arr = array(2011, 2010, 2009, 2008, 2007, 2006, 2005, 2004, 2003, 2002, 2001, 2000);  
      foreach ($arr as $key => $value) {  
         $newkey = $key+1;  
         if($newkey % 5 == 0) {  
         		echo '<div>'.$value.'</div>';  
         } else {  
         		echo $value;  
         }  
      }  
      
      

      So bekomme ich beim if ein jahr und unten 4.
      die trennung stimmt schonmal, aber wie bekomme ich den alle 5 jetzt in einem div?

      1. Hi,

        if($newkey % 5 == 0) {
            echo '<div>'.$value.'</div>';
           }

          
        
        > So bekomme ich beim if ein jahr und unten 4.  
        > die trennung stimmt schonmal, aber wie bekomme ich den alle 5 jetzt in einem div?  
          
        So erreichst du, dass jedes fünfte Element in einem eigenen Div eingepackt wird.  
          
        Du solltest im Fall x%5=0 den aktuellen Div beenden und einen neuen aufmachen. Die korrekte Gesamtausgabe der Div-Verschachtelung ergibt sich später erst über die gesamte Schleife.  
          
        Pseudocode:  
        öffne div  
        über alle Jahre  
           wenn index+1%5=0, dann  
              schließe div  
              öffne div  
           gib Jahreszahl aus  
        schließe div  
          
        Bis die Tage,  
        Matti
        
        -- 
        [Webapplikationen in C++ entwickeln](http://tntnet.org/)
        
      2. Hallo,

        $arr = array(2011, 2010, 2009, 2008, 2007, 2006, 2005, 2004, 2003, 2002, 2001, 2000);
        foreach ($arr as $key => $value) {
           $newkey = $key+1;
           if($newkey % 5 == 0) {

        die vorhergehenden zwei Zeilen lassen sich auch unter Verzicht auf

        die überflüssige Variable $newkey wie folgt schreiben:

        #    if( ($key + 1) % 5 == 0) {

        echo '<div>'.$value.'</div>';
           } else {
            echo $value;
           }
        }

        
        >   
        > So bekomme ich beim if ein jahr und unten 4.  
        > die trennung stimmt schonmal, aber wie bekomme ich den alle 5 jetzt in einem div?  
          
        Bevor Du die Schleife beginnst, musst Du das öffnende <div>-Tag des ersten div-Elementes schreiben.  
          
        In der Schleife prüfst Du (wie von suit vorgeschlagen und ähnlich wie von Dir angewandt), ob das div-Element geschlossen werden muss, weil eine neue 5er-Serie beginnt.  
        Wenn ja  
           schreibe schliessendes Tag,  
           schreibe öffnendes Tag  
        Sonst  
           schreibe ein Komma  
        Ende Wenn  
        Schreibe Wert  
          
        Nach der Schleife schreibst Du das schliessende Tag des letzten divs.  
          
        Verstehst Du die von mir vorgeschlagene Vorgehensweise.  
          
          
        Freundliche Grüße  
          
        Vinzenz
        
        1.   
          echo '<div>';  
          foreach ($arr as $key => $value) {  
             $newkey = $key+1;  
            
             if($newkey % 5 == 0) {  
             		echo $value.'</div>'.'<div>';  
             } else {  
          	   echo $value.',';  
          	}  
          }  
          echo '</div>';  
          
          

          Jetzt hab ichs entlich verstanden :-)
          Vielen Dank euch allen

          1. Noch ein paar Verbesserungen:

            $newkey = $key+1;
               if($newkey % 5 == 0) {

            diese $newkey-Variable ist unnütz, da kannst du eine Zeile code sparen;

            if(($key+1) % 5 == 0) {

            echo $value.'</div>'.'<div>';

            hier drei Strings zu verketten ist unnötig - zwei reichen.

            echo $value . '</div><div>';

            1. Vielen dank für die Verbesserungen

  2. Moin!

    Ich brauche von einem Array die Jahren und möchte es gerne in Blöcke ausgeben, sprich 1 Block gleich 5 Jahre

    mein array sieht z.b so aus

    $array = array(2011, 2010, 2009, 2008, 2007, 2006, 2005, 2004, 2003, 2002, 2001, 2000);

    foreach ($array as &$value) {
       echo $value;
    }

      
    Benutze die Funktion array\_chunk(), um dein Array in Teile zu je 5 Stücke zu unterteilen, und nimm dann eine doppelte foreach-Schleife.  
      
    - Sven Rautenberg
    
    1. Benutze die Funktion array_chunk(), um dein Array in Teile zu je 5 Stücke zu unterteilen, und nimm dann eine doppelte foreach-Schleife.

      Du immer mit deinen Öko-Alternativ-Lösungen :)

    2. Hallo,

      Ich brauche von einem Array die Jahren und möchte es gerne in Blöcke ausgeben, sprich 1 Block gleich 5 Jahre

      mein array sieht z.b so aus

      $array = array(2011, 2010, 2009, 2008, 2007, 2006, 2005, 2004, 2003, 2002, 2001, 2000);

      Hübscher und weniger Tippaufwand mit

      $array = [link:http://de2.php.net/manual/de/function.range.php@title=range](2011, 2000);

      foreach ($array as &$value) {
         echo $value;
      }

      
      >   
      > Benutze die Funktion array\_chunk(), um dein Array in Teile zu je 5 Stücke zu unterteilen, und nimm dann eine doppelte foreach-Schleife.  
        
      und bei PHP 5.3.0 oder neuer sogar ohne explizite Schleife mit array\_map und einer Lambda-Funktion:  
        
      ~~~php
      # Unser Ausgangsarray:  
      $array = [link:http://de2.php.net/manual/de/function.range.php@title=range](2011, 2000);  
        
      # Wir teilen das Array, wie von Sven vorgeschlagen, mit array_chunk  
      # in ein Array von 5er-Arrays auf. Das letzte kann kleiner ausfallen,  
      $chunks = [link:http://de2.php.net/manual/de/function.array-chunk.php@title=array_chunk]($array, 5);  
        
      # schaffen uns eine Lambda-Funktion, die ein Array mit dem Verbindungszeichen  
      # Komma (,) zu einer Zeichenkette zusammenfasst, siehe auch Beispiel #2 zu  
      # [link:http://de2.php.net/manual/de/function.array-map.php@title=array_map]:  
      $kommaliste = function($arr) { return implode(',', $arr); };  
        
      # wenden diese per array_map auf die inneren Arrays an  
      # und fassen das entstehende Arrays aus Zeichenketten mit der Zeichenfolge  
      # "</div>\n<div>" zusammen,  
      # setzen ein <div> vornedran  
      # und ein </div> hintendran  
      $result = '<div>'  
          . implode("</div>\n<div>", [link:http://de2.php.net/manual/de/function.array-map.php@title=array_map]($kommaliste, $chunks))  
          . "</div>\n";  
        
      # und geben unsere div-Kette aus.  
      # Anmerkung: die Zeilenumbrüche habe ich der besseren Lesbarkeit wegen eingefügt.  
      print $result;  
      
      

      Wir können den Code selbstverständlich übersichtlicher gestalten, wenn wir auf die überflüssigen Hilfsvariablen $array und $chunks verzichten ;-)

      <?php  
      	header("Content-Type: text/plain");  
      	  
      	$funct	= function($value) { return implode(',', $value); };  
      	print '<div>' . implode("</div>\n<div>", array_map($funct, array_chunk(range(2011, 2000), 5))) . '</div>';  
      ?>  
      
      

      Ausgabe:

      <div>2011,2010,2009,2008,2007</div>
      <div>2006,2005,2004,2003,2002</div>
      <div>2001,2000</div>

      Freundliche Grüße

      Vinzenz