sirgir: Array-Reihenfolge nicht konsistent

Hallo,

warum gibt

  
  
$log = array();  
  
$log[2] = "nenn mich 2";  
$log[1] = "sag eins zu mir";  
$log[0] = "ich bin null";  
$log[3] = "ich heiße drei";  
  
$line = implode("¿", $log);  
  
foreach($elements as $element)  
 echo $element."<br>";  
  

nenn mich 2
sag eins zu mir
ich bin null
ich heiße drei,

und nicht die Reihenfolge der indizes?

  1. sorry:

    $elements = implode("¿", $log);

    1. mann,
      ich meinte:

      warum gibt

        
      $log = array();  
        
      $log[2] = "nenn mich 2";  
      $log[1] = "sag eins zu mir";  
      $log[0] = "ich bin null";  
      $log[3] = "ich heiße drei";  
        
      $elements = implode("¿", $log);  
      echo $elements;  
      
      

      nenn mich 2¿sag eins zu mir¿ich bin null¿ich heiße drei

      1. hi,

        $log = array();

        $log[2] = "nenn mich 2";
        $log[1] = "sag eins zu mir";
        $log[0] = "ich bin null";
        $log[3] = "ich heiße drei";

        $elements = implode("¿", $log);
        echo $elements;

        
        >   
        >   
        > nenn mich 2¿sag eins zu mir¿ich bin null¿ich heiße drei  
          
        Warum sollte es (in PHP) anders sein?  
          
        "An array in PHP is actually an ordered map. A map is a type that associates values to keys. This type is optimized for several different uses; it can be treated as an array, list (vector), hash table (an implementation of a map), dictionary, collection, stack, queue, and probably more. As array values can be other arrays, trees and multidimensional arrays are also possible."  
          
        Quelle: php.net
        
        1. Warum sollte es (in PHP) anders sein?

          Weil die Schlüssel eben nicht ["1"], ["2"], etc sind, sondern [1], [2], etc, also vielleicht irgendeine fucking Bedeutung haben könnten.

          "An array in PHP is actually an ordered map. A map is a type that associates values to keys. This type is optimized for several different uses; it can be treated as an array, list (vector), hash table (an implementation of a map), dictionary, collection, stack, queue, and probably more. As array values can be other arrays, trees and multidimensional arrays are also possible."

          Quelle: php.net

          1. Moin!

            Warum sollte es (in PHP) anders sein?

            Weil die Schlüssel eben nicht ["1"], ["2"], etc sind, sondern [1], [2], etc, also vielleicht irgendeine fucking Bedeutung haben könnten.

            Arrays in PHP haben eine innere Reihenfolge der Elemente, die man z.B. durch foreach-Schleifen nutzbar macht.

            Denn parallel zu foreach kannst du ja auch mit einer for-Schleife, die einen numerischen Index hochzählt, alle Arraywerte in der Reihenfolge ihres numerischen Keys abrufen:

            for ($i=0; $i <=3; $i++) {  
              echo $log[$i];  
            }
            

            Funktioniert, und zerstört insbesondere nicht die innere Reihenfolge des Arrays. Ist aber natürlich blöd bei Lücken im Array-Index.

            Dass ein PHP-Array so eine Sortierung hat, muss man halt wissen und sich drauf einstellen. Der Vorteil ist halt, dass diese Datenstruktur ziemlich universell einsetzbar ist und eine sehr große Flexibilität erlaubt im Vergleich zu den klassischen Datentypen, die man aus anderen Programmiersprachen kennt.

            - Sven Rautenberg

            1. Vielen Dank für Deine Antwort.

              also mit "for" habe ich das früher realisiert, daher ist es mir auch nicht in der Form aufgefallen. Und daher bin ich vielleicht jetzt so verwundert. Seit dem ich foreach häufiger benutze (weil manchmal schneller, kürzer) ist mir anscheinend noch nie ein Konfliktfall vorgekommen. Und jetzt die große Überraschung.

              Gehe ich Recht in der Annahme, dass ich mit einem einfachen ksort für diesen Fall wieder foreach nehmen kann?

              Grüße
              sirgir

              1. Hi!

                Seit dem ich foreach häufiger benutze (weil manchmal schneller, kürzer) ist mir anscheinend noch nie ein Konfliktfall vorgekommen.

                Ein Konflikt zu was? foreach nimmt alle Elemente, die da sind. Wie die Schlüssel aussehen und welche vorhanden sind oder nicht, interessiert foreach nicht.

                Gehe ich Recht in der Annahme, dass ich mit einem einfachen ksort für diesen Fall wieder foreach nehmen kann?

                ksort() ändert die Reihenfolge im Array. Dem foreach ist das wie gesagt egal.

                Lo!

          2. Hello,

            Weil die Schlüssel eben nicht ["1"], ["2"], etc sind, sondern [1], [2], etc, also vielleicht irgendeine fucking Bedeutung haben könnten.

            Nein, das hat nichts mit Geschlechtsverkehr zu tun, sondern nur mit automatischer Typumwandlung :-))

            siehe https://forum.selfhtml.org/?t=201028&m=1355449

            Liebe Grüße aus dem schönen Oberharz

            Tom vom Berg

            --
             ☻_
            /▌
            / \ Nur selber lernen macht schlau
            http://bergpost.annerschbarrich.de
  2. Hello,

    warum gibt

    $log = array();

    $log[2] = "nenn mich 2";
    $log[1] = "sag eins zu mir";
    $log[0] = "ich bin null";
    $log[3] = "ich heiße drei";

    $line = implode("¿", $log);

    foreach($elements as $element)
    echo $element."<br>";

    
    >   
    > nenn mich 2  
    > sag eins zu mir  
    > ich bin null  
    > ich heiße drei,  
    >   
    >   
    > und nicht die Reihenfolge der indizes?  
      
    Weil Du dir PHP-Arrays als verkettete Listen bzw. Baumstrukturen vorstellen sollst und nicht als klassische Arrays, bei denen über den Index auch die Position im Speicher berechnet werden kann.  
      
    Jedes Array-Element bei PHP trägt den Namen (Index) und den Datenwert.  
      
      ![](http://selfhtml.bitworks.de/EinfachesArray500.gif)  
      
      
    Liste enthält ihrerseits wieder Listen und lässt sich daher als Baum darstellen:  
      
      
      ![](http://selfhtml.bitworks.de/VerzweigtesArray500.gif)  
      
      
    Foreach() fährt nun die Elementestruktur eines Zweiges ab und nimmt keine Rücksicht auf die Namen (Indexe) der Liste.  
      
      
      
      
      
    Liebe Grüße aus dem schönen Oberharz  
      
      
    Tom vom Berg  
    ![](http://selfhtml.bitworks.de/Virencheck.gif)  
      
    
    -- 
     ☻\_  
    /▌  
    / \ Nur selber lernen macht schlau  
    <http://bergpost.annerschbarrich.de>
    
    1. Sorry, aber bei Deinem ersten Bild hast Du es auch sortiert nach Indizes. Und "Nachfolger" und "Vorgänger" lassen auf eine Reihenfolge schliessen. Ich kapiers nicht. Ich hätte echt schwören können, dass ich das seit zwei Jahren so mache. Und das ist doch jetzt echt kaputt:

        
      $log = array();  
        
      $log[2] = "nenn mich 2";  
      $log[1] = "sag eins zu mir";  
      $log[0] = "ich bin null";  
      $log[3] = "ich heiße drei";  
        
      $log[2] = "neue 2";  
        
      $elements = implode("¿", $log);  
      echo $elements;  
      
      

      neue 2¿sag eins zu mir¿ich bin null¿ich heiße drei

      Jetzt hält er sich also an den Index 2.

      (Sorry, war ein langer frustrierender Tag. Morgen wird alles besser.)

      1. Hi,

        $log = array();

        $log[2] = "nenn mich 2";
        $log[1] = "sag eins zu mir";
        $log[0] = "ich bin null";
        $log[3] = "ich heiße drei";

        $log[2] = "neue 2";

        $elements = implode("¿", $log);
        echo $elements;

        
        >   
        >   
        > neue 2¿sag eins zu mir¿ich bin null¿ich heiße drei  
        >   
        > Jetzt hält er sich also an den Index 2.  
        >   
          
        Du überschreibst den Key 2 ja auch wieder.  
        $log[2] = "neue 2";  
        $log[2] = "neue 3";  
        $log[2] = "neue 4";  
        $log[2] = "neue 5";  
          
        was ist $log[2] jetzt?  
          
        Brillo  
        
        
      2. Hi!

        Sorry, aber bei Deinem ersten Bild hast Du es auch sortiert nach Indizes.

        Zufall.

        Und "Nachfolger" und "Vorgänger" lassen auf eine Reihenfolge schliessen.

        Ja, es ist die Reihenfolge, in der du die Elemente in das Array hängst. Das ist nun mal bei PHP-Arrays so. Du kannst auch Nummern weglassen, ohne dass die Elemente nachrutschen und mit neuen Keys versehen werden. Es ist dann eben eine Lücke in der Nummerierung der Keys.

        Und das ist doch jetzt echt kaputt:

        Nein. Warum sollte PHP ungefragt eine Sortierung vornehmen? Ungeachtet dessen kannst du mit einem Handgriff (aka Funktionsaufruf) eine solche vornehmen.

        Jetzt hält er sich also an den Index 2.

        Der Key hat schon existiert, weswegen das Element geändert wird und nicht etwa dieses entfernt und hinten ein neues angehängt wird.

        Lo!

      3. Hello,

        Sorry, aber bei Deinem ersten Bild hast Du es auch sortiert nach Indizes.

        Ja, aber ich habe im Text darauf hingewiesen, dass die Elemente eben nicht automatsich nach Namen (Index) sortiert werden.

        Bitte stelle Dir vor, dass jedes neue Element immer vor dem Ende der Kette eingefügt wird, wenn nichts anderes durch eine spezielle Funktion bestimmt worden ist. Der Name (Index) ist dabei nur relevant, wenn schon ein Element existiert unter diesem Namen im betroffenen Ast des Baumes. Dann wird es überschrieben.

        Und "Nachfolger" und "Vorgänger" lassen auf eine Reihenfolge schliessen.

        Klar, Reihenfolge ist immer notwendig. Aber die ist eben quasi physisch orientiert und nicht nach Index.

        Ich kapiers nicht. Ich hätte echt schwören können, dass ich das seit zwei Jahren so mache.

        Dafür solltest Du dir auch ruhig einen vollen Lernzyklus gönnen. Also heute hören und glauben, Du hättest es kapiert. morgen selber ausprobieren und Erfolg haben, übermorgen überhaupt nichts mehr verstehen und dann spätestens am Montagf macht es "Klick". :-))

        Und das ist doch jetzt echt kaputt:

        $log = array();

        $log[2] = "nenn mich 2";
        $log[1] = "sag eins zu mir";
        $log[0] = "ich bin null";
        $log[3] = "ich heiße drei";

        $log[2] = "neue 2";   ## überschreibt das Element mit dem Index 2

        $elements = implode("<br>\r\n", $log);  ## für das HTML-Umfeld ...

        ## (aber noch ohne vollständige Kontextbehandlung!)

        echo $elements;

          
          
        Und um das Ganz noch mehr zu komplizieren: Es gibt numerische Indexe und es gibt alphanumerische Indexe (Namen). Die Arrayxs aus Elementen mit alpanumerischen Indexen werden in PHP "assoziative Arrays" genannt. Und man kann beide Formen mischen. Dann wird es ganz kompliziert, denn solche Indexe, die ohne Probleme in numerische umgewanderlt werden können werden automatisch in numerische Indexe umgewandelt.  
          
        Ein $\_element['0'] wird also automatisch zu $\_element[0].  
          
        Wenn man das nicht beachtet, kann es fatale Folgen haben.  
          
          
          
          
          
        Liebe Grüße aus dem schönen Oberharz  
          
          
        Tom vom Berg  
        ![](http://selfhtml.bitworks.de/Virencheck.gif)  
          
        
        -- 
         ☻\_  
        /▌  
        / \ Nur selber lernen macht schlau  
        <http://bergpost.annerschbarrich.de>
        
      4. für Eure Ruhe und die Erklärungen.

        Es geht mir schon wieder besser, bei dem Gedanken, was php da macht :)

        Nein, wirklich vielen Dank für Eure Erklärungen.

        Grüße
        sirgir