Wolowitz: Array Erstellung

Schönen guten Tag,

ich habe eine kleine Unklarheit bzgl. der Erstellung eines Arrays.
Die Standardsyntax ist mir klar:

// Ein neues Array erstellen:  
$config=array('user'=>'foo','password'=>'bar');

Nun habe ich Folgendes gesehen:

// Ein neues Array erstellen:  
$config['cms']=array('user'=>'foo','password'=>'bar');

Was für eine Funktion bzw. Bedeutung hat hier ein Terminus in eckigen Klammern nach dem Arraynamen? Im Manual habe ich diese Art einer zusätzlichen Angabe nicht gefunden.

Mit lieben Grüßen

H. Wolowitz

--


Gut, dann können wir die Zettel von den Laternen nehmen...
  1. Lieber Wolowizard,

    Dem Inginoer is was zu schwoer? Sheldon fragen waer wohl zu demutigend gewesen, hm?
    Koennte es sich bei $config um ein Array handeln, in dessen Element 'cms' ein weiteres Array geschrieben wird? Eventuell handelt es sich hier um ein Mehrdimensionales Array?

    --
    Signaturen sind blöd!
    1. Schönen guten Tag, Steel,

      Koennte es sich bei $config um ein Array handeln, in dessen Element 'cms' ein weiteres Array geschrieben wird? Eventuell handelt es sich hier um ein Mehrdimensionales Array?

      Völlig richtig. (Siehe meine Antwort an Dedlfix!) Danke für die Hilfe!

      Mit lieben Grüßen

      H. Wolowitz

      --

      Gut, dann können wir die Zettel von den Laternen nehmen...
      1. Dann mal n schoenen Gruss an die Herren Physiker und die reizende Penny. ;)

        --
        Signaturen sind blöd!
        1. Dann mal n schoenen Gruss an die Herren Physiker und die reizende Penny. ;)

          hmm? Stehe auf dem Schlauch. Um was gehts?

          1. Dann mal n schoenen Gruss an die Herren Physiker und die reizende Penny. ;)

            hmm? Stehe auf dem Schlauch. Um was gehts?

            Wolowitz ist glaube ich ein Charakter aus der Big-Bang-Theory.

            1. Dann mal n schoenen Gruss an die Herren Physiker und die reizende Penny. ;)

              hmm? Stehe auf dem Schlauch. Um was gehts?

              Wolowitz ist glaube ich ein Charakter aus der Big-Bang-Theory.

              Ich dachte schon, es gibt mit der reizenden Penny eine neue Figur bei Dürrenmatt.

  2. Tach!

    Erstellung eines Arrays. Die Standardsyntax ist mir klar:

    // Ein neues Array erstellen:

    $config=array('user'=>'foo','password'=>'bar');

      
    Oder ab PHP 5.4 auch  
    `$config = ['user' => 'foo', 'password' => 'bar'];`{:.language-php}  
      
    
    > `$config['cms']=array('user'=>'foo','password'=>'bar');`{:.language-php}  
    > Was für eine Funktion bzw. Bedeutung hat hier ein Terminus in eckigen Klammern nach dem Arraynamen? Im [Manual](http://php.net/manual/en/language.types.array.php) habe ich diese Art einer zusätzlichen Angabe nicht gefunden.  
      
    Ist aber auf genau der Seite beschrieben: <http://php.net/manual/en/language.types.array.php#language.types.array.syntax.modifying>  
      
      
    dedlfix.
    
    1. Schönen guten Tag, Dedlfix,

      Ist aber auf genau der Seite beschrieben: http://php.net/manual/en/language.types.array.php#language.types.array.syntax.modifying

      Ich war deshalb verwirrt, weil auch dort die Kombination mit der eckigen Klammer links und einem 'array(...)' rechts vom Gleichheitszeichen nicht vorkommt.

      OK, auf gut Deutsch: Hier bilden 2 Strings (mit 2 Indizes) ein assoziative Array. Und _das_ wiederum wird dann _nochmals_ (mit dem Index 'cms') in das Array 'config' verfrachtet. Nachdem diese Vorgehensweise in diesem Zusdammenhang (es geht nur um die Definition von Usernamen und Passwort für die weitere Verwendung im Skript!) völlig unnötig verkompliziert wird und auch die Bildung des mehrdimensionalen Arrays total unnötig ist, wäre ich in 5 Jahren nicht auf die Idee gekommen, in diese Richtung zu überlegen. Meine Frage ist somit beantwortet.

      Danke für den Denkanstoß!

      Mit lieben Grüßen

      H. Wolowitz

      --

      Gut, dann können wir die Zettel von den Laternen nehmen...
      1. Hallo,

        OK, auf gut Deutsch: Hier bilden 2 Strings (mit 2 Indizes) ein assoziative Array. Und _das_ wiederum wird dann _nochmals_ (mit dem Index 'cms') in das Array 'config' verfrachtet. Nachdem diese Vorgehensweise in diesem Zusdammenhang (es geht nur um die Definition von Usernamen und Passwort für die weitere Verwendung im Skript!) völlig unnötig verkompliziert wird und auch die Bildung des mehrdimensionalen Arrays total unnötig ist, wäre ich in 5 Jahren nicht auf die Idee gekommen, in diese Richtung zu überlegen. Meine Frage ist somit beantwortet.

        Es gibt in PHP keine mehrdimensionalen Arrays, auch wenn es gelegentlich immer wieder behauptet wird. Es sind im Grunde nichtmal wirkliche Arrays (Felder), sondern meines Erachtens eher ein Konzept wie Hashmaps, auch assoziative Arrays genannt. Diese Arrays können als Element auch weitere Arrays beinhalten, womit man ein mehrdimensionales Array zumindest simulieren kann.

        Logiker

        1. Es sind im Grunde nichtmal wirkliche Arrays (Felder), sondern meines Erachtens eher ein Konzept wie Hashmaps, auch assoziative Arrays genannt.

          Ich kann doch auch Arrays mit numerischen Indizes erzeugen, wo ist das Problem?

            
          $foo = ['bar','baz'];  
          
          
          1. Es sind im Grunde nichtmal wirkliche Arrays (Felder), sondern meines Erachtens eher ein Konzept wie Hashmaps, auch assoziative Arrays genannt.

            Ich kann doch auch Arrays mit numerischen Indizes erzeugen, wo ist das Problem?

            $foo = ['bar','baz'];

              
            Kannst du machen, trotzdem ist es kein "richtiges" Feld (Array), wie man es zum Beispiel aus C kennt.  
              
            "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. "  
              
            <http://php.net/manual/de/language.types.array.php>  
              
            Gibst du keinen Key an, wird implizit der nächstmögliche numerische Index genommen:  
              
            ~~~php
              
            $test = array(  
            	"apfel",  
            	1 => "birne",  
            	"zitrone",  
            	3 => "beere",  
            );  
            print_r($test);  
            
            
              
            $test = array(  
            	"apfel",  
            	1 => "birne",  
            	"zitrone",  
            	2 => "beere",  
            );  
            print_r($test);  
            
            
            1. Kannst du machen, trotzdem ist es kein "richtiges" Feld (Array), wie man es zum Beispiel aus C kennt.

              Okay, habe die Aussage aus deiner ersten Antwort missverstanden und geglaubt du wolltest darauf hinaus, dass PHP-Arrays weniger mächtig sind. Mein Fehler.

              1. Hi,

                Kannst du machen, trotzdem ist es kein "richtiges" Feld (Array), wie man es zum Beispiel aus C kennt.

                Okay, habe die Aussage aus deiner ersten Antwort missverstanden und geglaubt du wolltest darauf hinaus, dass PHP-Arrays weniger mächtig sind. Mein Fehler.

                in gewisser Hinsicht sind sie auch weniger mächtig als richtige Felder. Sie sind aufrund ihrer universalen Struktur her wesentlich langsamer zu verarbeiten. Aber genau diese universale Struktur ist es, die sie anderswo wieder stärker macht, als gewöhnliche Felder. Sprich, in Java z.b. bräuchte man mehrere Datentypen, um das zu machen, was man mit PHP-Arrays machen kann (Hashmaps, Arrays, Lists, ...). Ich persönlich bin ein großer Freund von Datenstrukturen, die mit PHP-Arrays abgebildet sind.

                1. Ich persönlich bin ein großer Freund von Datenstrukturen, die mit PHP-Arrays abgebildet sind.

                  Ich kann mich nicht ganz damit anfreunden. Mir gefallen schon die ganzen Array-Funktionen nicht, alles prozedural, pfui. Ich bevorzuge da Javascript-Style / JSON.

                  1. Ich persönlich bin ein großer Freund von Datenstrukturen, die mit PHP-Arrays abgebildet sind.

                    Ich kann mich nicht ganz damit anfreunden. Mir gefallen schon die ganzen Array-Funktionen nicht, alles prozedural, pfui. Ich bevorzuge da Javascript-Style / JSON.

                    "alles prozedural, pfui."

                    Ich kann nicht ganz folgen. Beim Zusammenbau von Datenstrukturen während der Laufzeit nutzt du unter PHP JSON-Strukturen? Wie können einem Array-Funktionen nicht gefallen? Weil sie nicht objektorientiert sind? Spricht nichts dagegegen, sich eine Array-Verwaltungsklasse zu bauen. Vielleicht solltest du auch mal einen Blick auf ArrayObject bzw. ArrayIterator werfen.

                    1. "alles prozedural, pfui."

                      Ich kann nicht ganz folgen. Beim Zusammenbau von Datenstrukturen während der Laufzeit nutzt du unter PHP JSON-Strukturen?

                      Nein nein, ich mag nur die Arbeit mit Arrays unter Javascript mehr, als die Arbeit mit PHP-Arrays. Klar Äpfel mit Birnen, aber wenn es darum geht persönliche Präferenzen von Datenstrukturen auszudrücken, kann ich nicht davon lassen.

                      Wie können einem Array-Funktionen nicht gefallen? Weil sie nicht objektorientiert sind?

                      Genau das.

                      Spricht nichts dagegegen, sich eine Array-Verwaltungsklasse zu bauen. Vielleicht solltest du auch mal einen Blick auf ArrayObject bzw. ArrayIterator werfen.

                      Klar das sind Möglichkeiten, aber da hab ich schon wieder zwei verschieden Konstrukte. Ein array und ein ArrayObject. In JS ist sort einfach eine Methode eines Arrays, gut is. Das kommt mir wesentlich natürlicher und eleganter vor. Ich finde an dieser Stelle merkt man deutlich, dass bei PHP nicht von Beginn an ein konsequenter objektorientierten Ansatz verfolgt wurde.

          2. Tach!

            Es sind im Grunde nichtmal wirkliche Arrays (Felder), sondern meines Erachtens eher ein Konzept wie Hashmaps, auch assoziative Arrays genannt.
            Ich kann doch auch Arrays mit numerischen Indizes erzeugen, wo ist das Problem?

            Das "Problem" ist, dass "Array" als eine einfache Liste definiert ist und der Indexwert die Position darin angibt. Ein PHP-Array simuliert eine solche indexbasierte Liste nur, denn man kann ohne weiteres Lücken in diesen Indexwerten haben oder die Elemente umsortieren und den Key beibehalten. Somit gibt der Indexwert nicht einfach nur die Position an, sondern ist den Elementen direkt zugeordnet. Solch eine Struktur entspricht aber einer Map.

            Das PHP-"Array" ist also (auch laut Handbuch) in Wirklichkeit eine geordnete Map (Ansammlung von Schlüssel-zu-Wert-Zuordnungen). Je nachdem, wie der Inhalt einer Map aussieht, ähnelt sie verschieden anderen Datentypen: Array, Dictionary, Collection, Stack, Queue, ... Sie ist damit recht universal einsetzbar.

            Man kann also ein Array im eigentlichen Sinne simulieren, solange man bestimmte Voraussetzungen einhält: fortlaufende und lückenlose Keys. Und man kann auch mehrdimensionale Arrays simulieren, indem man indexbasierte Arrays als Elemente eines indexbasierten Arrays verwendest. Für mich ist ein mehrdimensionales Array eins, das gleichmäßig in seine Dimensionen strebt. Da man aber in PHP-Arrays Lücken reinbringen kann, "verkommt" eine solche Datensammlung mehr und mehr zu einer Baumstruktur. Und völlig vom mehrdimensionalen Gedanken losgelöst ist es, wenn man für die Keys keine fortlaufenden Werte sondern beliebige Strings verwendet.

            Das PHP-Array ist wegen seiner Map als Basis eine sehr universelle Angelegenheit. Dieser Universalität sollte man sich bewusst sein. Man kann eben nicht immer wie bei herkömmlichen Arrays einfach mit for($i;...;$i++) über das Array gehen, sondern benötigt foreach, weil man mit for bei Lücken stolpert, wenn man sie nicht beachtet.

            dedlfix.