Björn: Einfügen von Elementen in associativen Array an bestimte Pos.

Hallo,

ich möchte folgendes realisieren:

array('Name' => 'Fritz', 'Nachname' => 'Walter', 'Strasse' => 'Parkallee');

Dieses Array möchte ich an 2. Position einfügen:

array('Plz' => 12345);

Ergebnis:

array('Name' => 'Fritz', 'Nachname' => 'Walter', 'Plz' => 12345, 'Strasse' => 'Parkallee');

Gibt es eine bestehende Funktion oder kann mir jemand damit helfen?

Danke,
Björn

  1. Hallo,

    Dieses Array möchte ich an 2. Position einfügen:

    Ein Ass. Array hat per Definition keine Positionen!
    array_push o.ä. funktioniert deswegen darauf auch nicht.

    Wenn Du die Keys in einer speziellen Reihenfolge willst, benötigst Du vermutlich ein Hilfsarray, welches zu jedem key die Positionen speichert.

    Viele Grüße,
    Jörg

    1. Hi mrjerk.

      Ein Ass. Array hat per Definition keine Positionen!

      Doch.

      array_push o.ä. funktioniert deswegen darauf auch nicht.

      Doch.

      @Bjoern:

      Gibt es eine bestehende Funktion

      Ich kenne keine, die etwas derartiges tut.

      oder kann mir jemand damit helfen?

      Schreib eine. Vorschlag: Sie kriegt das Array, das Schluessel-Wert-Paar des einzufuegenden Elementes und den Schluessel des Elementes, hinter dem es eingefuegt werden soll, baut das gewuenschte Array und gibt es zurueck. Duerfte ein Dreizeiler sein, oder?

      Viele Gruesse,
      der Bademeister

      1. Tag Bademeister,

        Ein Ass. Array hat per Definition keine Positionen!

        Doch.

        Jein.
        PHP speichert ALLE arrays in einer assoziativen Form.
        Dass in PHP überhaupt so etwas wie eine Ordnung auf Arrays existiert liegt daran, dass die Arrays intern als sortierte Map abgelegt werden, sie sind also automatisch nach ihrem Schlüssel (ob numerisch oder nicht) sortiert.

        »»array_push o.ä. funktioniert deswegen darauf auch nicht.
        Doch.

        Was daran liegt, dass in PHP alle Arrays intern assoziativ gespeichert werden, ja. Es kommt aber, wenn man sich diese besondere Eigenschaft der PHP-Arrays zu Nutze macht,  in den seltensten Fällen das raus, was sich der Programmierer erwartet (Zitat aus o.g. Seite):

        "[...]Attempting to append to an associative array is almost always a programmer mistake, but PHP will give the new elements numeric indexes without issuing a warning:

          
        $person = array('name' => 'Fred');  
        $person[] = 'Wilma';                   // $person[0] is now 'Wilma'  
        
        

        [...]"
        Nach der PHP-internen Realisierung zwar völlig logisch so, aber im Zweifelsfall nicht das, was sich der Programmierer so vorstellt.

        Ein assoziatives Array mit push, pop usw. zu behandeln mag funktionieren, weil PHP eben intern auch mit numerischen Arrays wie mit assoziativen Arrays umgeht - semantisch ist es aber Blödsinn.

        Ein assoziatives Array bildet keine Liste mit "vorne" und "hinten" - die Array-SCHLÜSSEL hingegen schon.

        Viele Grüße,
        Jörg

        1. Hi.

          Tag Bademeister,

          Tag? Um 23.51? Student?  ;-)

          Ein Ass. Array hat per Definition keine Positionen!

          Doch.
          Jein.

          Nein. :-)

          PHP speichert ALLE arrays in einer assoziativen Form.

          Ich hab den Artikel mal angelesen:

          There are two kinds of arrays in PHP: indexed and associative.

          ist Unsinn. Hätte besser geheißen:
          "There is one kind of array in PHP: array."

          Es gibt zwei Typen von Schlüsseln(!), nämlich numerische und Strings. Und beide können in demselben Array vorkommen. Wenn einer der Typen nicht vorkommt (oder gar beide), macht das das Array zu nichts Speziellem.

          Noch viel größerer Blödsinn steht da zum Thema "Quoten von Array-Schlüsseln". Ich mag es hier gar nicht zitieren. Viel weiter hab ich nicht gelesen, aber es reicht mir, um Dich zu bitten, diesen Artikel nie nie nie mehr zu verlinken! Und am besten auch nicht selber zu lesen :-) Höchstwahrscheinlich steht ohnehin nichts drin, was nicht in der PHP-Doku steht und richtig ist.

          Dass in PHP überhaupt so etwas wie eine Ordnung auf Arrays existiert liegt daran, dass die Arrays intern als sortierte Map abgelegt werden,

          Wieso also oben "Jein"?

          sie sind also automatisch nach ihrem Schlüssel (ob numerisch oder nicht) sortiert.

          Nein. Den Schlüsseln (ob numerisch oder nicht) kannst Du die Sortierung nicht ansehen.

          »»array_push o.ä. funktioniert deswegen darauf auch nicht.
          Doch.
          Was daran liegt, dass in PHP alle Arrays intern assoziativ gespeichert werden, ja. Es kommt aber, wenn man sich diese besondere Eigenschaft der PHP-Arrays zu Nutze macht,  in den seltensten Fällen das raus, was sich der Programmierer erwartet

          Wenn der Programmierer weiß, was die Funktion array_push tut, dann kommt bei ihrer Benutzung auch das raus, was der Programmierer erwartet. Oder?

          "[...]Attempting to append to an associative array is almost always a programmer mistake,

          Das kann gut sein. Weiß ich nicht. Aber das war doch nun wirklich nicht die Frage.

          Ein assoziatives Array mit push, pop usw. zu behandeln mag funktionieren, weil PHP eben intern auch mit numerischen Arrays wie mit assoziativen Arrays umgeht - semantisch ist es aber Blödsinn.

          Mit array_pop wär ich da schon ein bisschen vorsichtiger, ehrlich gesagt.

          Ein assoziatives Array bildet keine Liste mit "vorne" und "hinten" - die Array-SCHLÜSSEL hingegen schon.

          Die Aussage versteh ich nicht. (Wirklich nicht.)

          Einigen wir uns drauf, dass die Anwendung von array_push auf (rein) assoziative Arrays im allgemeinen nicht gerade ein heißer Tipp für PHP-Anfänger ist ;-)

          Viele Grüße,
          der Bademeister

          1. Hi!

            PHP speichert ALLE arrays in einer assoziativen Form.
            Noch viel größerer Blödsinn steht da zum Thema "Quoten von Array-Schlüsseln". Ich mag es hier gar nicht zitieren.

            Was genau stört dich an der dortigen Aussage? Der einzige Punkt, den ich sehe, ist, dass dort $a['foo'] als gleich zu $a[foo] beschrieben wird, wenn es außerhalb von ""-Strings vorkommt. Wenn die NOTICE-Meldungen deaktiviert sind, wird das noch nicht mal geahndet. Allerdings wird auch darauf hingewiesen, was der Nachteil der Methode ist.

            Höchstwahrscheinlich steht ohnehin nichts drin, was nicht in der PHP-Doku steht und richtig ist.

            Was soll in einem Tutorial/Buch auch die Sprache und Funktionen betreffend anderes drinstehen als in der offiziellen Dokumentation (wenn diese nicht lückenhaft ist)? Das PHP-Handbuch ist als Nachschlagewerk gut geeingnet. Als alleiniges Werk, um die Sprache zu lernen, besonders wenn man noch kaum Vorkenntnisse vom Pragrammieren hat, sehe ich es als unzureichend an.

            Lo!

            1. Hi dedlfix.

              Was genau stört dich an der dortigen Aussage? Der einzige Punkt, den ich sehe, ist, dass dort $a['foo'] als gleich zu $a[foo] beschrieben wird, wenn es außerhalb von ""-Strings vorkommt.

              Genau das stoert mich. Und zwar recht massiv. Offenbar massiver als Dich.

              Allerdings wird auch darauf hingewiesen, was der Nachteil der Methode ist.

              Sehe ich nicht so - zumindest nicht hinreichend. Der Nachteil der Methode ist in erster Linie, dass sie nicht korrekt ist (vgl. Handbuch). Eine Schreibweise, die eine Notice erzeugt, und eine, die keine Notice erzeugt, als "the same" zu bezeichnen, ist m.E. ein no-go (auch wenn im Einzelfall die Werte der Ausdruecke dieselben sein koennen).

              Ich weiss auch nicht, ob es Hoffnung gibt, dass es sich in der Zukunft PHPs irgendwann aendert, dass diese Schreibweise nur mit einer Notice bedacht wird, aber gerade im Hinblick darauf muss man m.E. von ihrer Benutzung warnen.

              Höchstwahrscheinlich steht ohnehin nichts drin, was nicht in der PHP-Doku steht und richtig ist.

              Was soll in einem Tutorial/Buch auch die Sprache und Funktionen betreffend anderes drinstehen als in der offiziellen Dokumentation (wenn diese nicht lückenhaft ist)?

              Na ja, ich bin eh nicht so ein Fan von Tutorials. Aber wenn, dann wuerde ich in einem (Anfaenger-)Tutorial gute(!) und sinnvolle(!) Beispiele und Illustrationen erwarten. Die zu schreiben, ist keineswegs so einfach, wie manch einer denkt, und ein erheblicher Teil der Anforderungen, die an den Autor mit dem Schreiben eines Tutorials gestellt werden. Und in diesem Artikel stehen auch keine drin. Daher ist es kein Tutorial (das ist es wirklich nicht). Und daher gibt es keinen Grund, das Ding zu lesen. Meiner Meinung nach.

              Das PHP-Handbuch ist als Nachschlagewerk gut geeingnet. Als alleiniges Werk, um die Sprache zu lernen, besonders wenn man noch kaum Vorkenntnisse vom Pragrammieren hat, sehe ich es als unzureichend an.

              Zustimmung.

              Viele Gruesse,
              der Bademeister

              1. Hi!

                Was genau stört dich an der dortigen Aussage? Der einzige Punkt, den ich sehe, ist, dass dort $a['foo'] als gleich zu $a[foo] beschrieben wird, wenn es außerhalb von ""-Strings vorkommt.
                Genau das stoert mich. Und zwar recht massiv. Offenbar massiver als Dich.

                Das ist in PHP konzeptionsbedingt so lasch gehandhabt. Es stört mich deshalb nicht massiv, weil es zur Philosophie passt. Dass es bessere Systeme gibt, steht außer Frage.

                Allerdings wird auch darauf hingewiesen, was der Nachteil der Methode ist.
                Sehe ich nicht so - zumindest nicht hinreichend. Der Nachteil der Methode ist in erster Linie, dass sie nicht korrekt ist (vgl. Handbuch).

                Eine Altlast. Und Rasmus Lerdorf dürfte diesen Fehler, der aber trotzdem meistens richtig arbeitet, nicht all zu sehr verteufeln, ist die Sprache doch schließlich "auf seinem Mist gewachsen".

                Ich weiss auch nicht, ob es Hoffnung gibt, dass es sich in der Zukunft PHPs irgendwann aendert, dass diese Schreibweise nur mit einer Notice bedacht wird, aber gerade im Hinblick darauf muss man m.E. von ihrer Benutzung warnen.

                Wohl kaum, denn dann müsste PHP insgesamt viel strenger werden. Unter anderem müssten auch Lesezugriffe auf nicht vorhandene Variablen als echte Fehler gelten und nicht nur Notice-relevant sein.

                Lo!

                1. Ich weiss auch nicht, ob es Hoffnung gibt, dass es sich in der Zukunft PHPs irgendwann aendert, dass diese Schreibweise nur mit einer Notice bedacht wird, aber gerade im Hinblick darauf muss man m.E. von ihrer Benutzung warnen.

                  Wohl kaum, denn dann müsste PHP insgesamt viel strenger werden. Unter anderem müssten auch Lesezugriffe auf nicht vorhandene Variablen als echte Fehler gelten und nicht nur Notice-relevant sein.

                  Das faende ich aeusserst begruessenswert. Dynamische Handhabung von Variablentypen und viele implizite Typkonvertierungen, wie sie in PHP vorgesehen sind, muessen doch noch lange kein "lasches Umgehen" mit Variablentypen bedeuten (auch wenn "dynamisch" auf den ersten Blick wie "lasch" wirken mag). Es ist moeglich, streng, praezise und trotzdem dynamisch mit Variablentypen umgehen. Und m.E. wuerde es PHP guttun, das such zu machen.

                  Ich moechte allerdings nach nochmaligem Lesen meines obigen Postings hier noch bemerken, dass ich den Artikel nach der Lektuere des ersten Teils nicht notwendigerweise gleich pauschel als Bloedsinn haette bezeichnen muessen wegen zweier Ungereimtheiten darin. Den Zweck des Artikels bzw. einen Mehrwert gegenueber der Dokumentation sehe ich darin dennoch nicht.

                  Viele Gruesse,
                  der Bademeister

          2. Tag? Um 23.51? Student?  ;-)

            Vertrauens-Arbeitszeit :-P

            Einigen wir uns drauf, dass die Anwendung von array_push auf (rein) assoziative Arrays im allgemeinen nicht gerade ein heißer Tipp für PHP-Anfänger ist ;-)

            Gut, akzeptiert :)