Was gibt es für Strukturen von Arrays (PHP), was ist mit den Strukturen gemeint?

... komplette Frage anzeigen

2 Antworten

Ich bin mir nicht sicher, ob ich genau verstehe, was du eigentlich wissen möchtest. Deine Frage kann man auf vielerlei Weise interpretieren. Aber ich versuche es mal:

Vorweg: Ein sog. "Array" in PHP ist vermutlich die grausamste - jemals implementierte - Datenstruktur, vor der man sich fürchten sollte. Zumindest, wenn man mit anderen Programmiersprachen halbwegs vertraut ist. :)

Kurz gesagt ist das Ding, was in PHP salopp "Array" genannt wird, ein wirres Mischmasch eines generischen (!) echten (!) Arrays / einer Liste / eines Dictionaries / einer Hash Tabelle. Man kann es parallel als Collection / Stack / Queue / Set und mehr benutzen. Außerdem kann man es als mehrdimensionales Array oder für Bäume missbrauchen ... gibt ja leider keine Alternative. :)

Normalerweise ist so ein Alleskönner-Objekt ein Antipattern, welches "Blob" genannt wird. Aber im PHP-Interpreter-Quelltext stecken so unglaublich viele Antipattern, dass Blob-Objekte schon gar nicht mehr auffallen. :)

(Wer Interesse hat, kann sich mal den aktuellen PHP-Quelltext angucken, aber vorher stabil hinsetzen! Darin ist nämlich alles an schlechtem Stil vereint, was man sich vorstellen kann. Ich rede hier also nicht von der Sprache PHP an sich, sondern vom C-Quelltext des PHP-Interpreters! Und der ist echt un-glaub-lich übel!)

Allerdings ist die Performance für so einen Murks erstaunlich gut. Mit der aktuellsten PHP 5.6.22 Version ist das hinzufügen eines Integers in einer Schleife zu einem "Array" nur ungefähr 70 mal langsamer, als das Hinzufügen eines Integers zu einem C++-Vektor. Und in der aktuellsten PHP 7.0.7 Version ist es sogar nur noch ca. 20 mal so langsam! Und das, trotz dem ganzen Pfusch ... erstmal Respekt dafür! :)

Dazu muss man wissen, dass PHP intern eine Spezialisierung für Integer benutzt und andere Objekte nochmal deutlich langsamer sind, aber in meinem Benchmark ging es mir nur um Integer. (Hab dafür ein Programm geschrieben, was die einzelnen CPU-Instruktionen zählt, um ein objektiveres Ergebnis, als ein Profiling mit Timern zu bekommen.)

Naja, wie auch immer ... wenn dich dein Lehrer fragt, was ein PHP-Array ist und kann, dann sag einfach: "Alles". :)

Schönen Tag noch!

PS: Ganz kleine Anekdote für Interessierte ... Guckt euch mal den PHP Quelltext in "ext/standard/array.c" an! Erst mal fällt auf, dass PHP-Entwickler wohl auf void-Zeiger stehen ... das nimmt dem Compiler erst mal jede Möglichkeit der Fehlererkennung, aber gut ...

Dann die Namensgebung bei Variablennamen! Double-Variablen heißen "d", Longs heißen "l" ... und wenn es mehrere gibt, dann werden sie "d1" und "d2", bzw "l1" und "l2" genannt. Daran erkennt der geübte Softwareentwickler natürlich auf den ersten Blick, wofür die Variablen eigentlich gedacht sind. :)

Dann wird total wirr manchmal "size_t" und manchmal "zend_long" für Dinge benutzt, die die gleiche Funktion haben. Hätte man sich bei der inzwischen 7ten PHP Version nicht so langsam mal auf eines von beiden einigen können?

Dann noch solche Bezeichner, wie MAX_LENGTH_OF_LONG deren subtile Bedeutung sich auch erst auf den zweiten oder dritten Blick erschließt.

Nicht zu vergessen, die ellenlangen Bezeichner wie php_array_key_compare_string_natural_general oder Makros wie ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_TMPVAR_HANDLER ... länger gings wohl nicht. :)

Aber naja ... hat alles nichts mit der Frage zu tun. Ende. :)

Kommentar von fluffiknuffi2
14.06.2016, 20:24

Hätte man sich bei der inzwischen 7ten PHP Version nicht so langsam mal auf eines von beiden einigen können?

Da bzw. das noch weiterführend gebe ich dir absolut Recht. Man hätte mit 7 (vor allem wenn 6 schon mehr oder weniger überspringt) weniger auf schnellere Arrays, Spaceship-Operator und sonstiges Blingbling setzen, sondern sich der grundsätzlichen Kritik stellen sollen und das ist leider kaum geschehen.

Lieber Kompatibilität beibehalten bzw. annehmen, dass die mysql-Extension endlich heraus zu werfen ein so harter Schnitt war, dass man mehr nicht zumuten konnte? 

PHP 7 hat definitiv einiges verbessert, aber jemand der vorher Antipathie hegte wird durch PHP 7 nicht umgestimmt. (Außer vielleicht ein paar Hack-Programmierer :'D )

1

Ich hoffe ich habe deine Frage richtig verstanden. Es gibt außer den normalen Arrays, wo die Werte über einen Ziffernschlüssel erreichbar sind, also z.B.

$obst = array('Apfel', 'Banane', 'Erdbeere');

noch assoziative Arrays, wo du als Schlüssel z.B. einen String hast:

$lebensmittel = array('obst' => 'Apfel', 'gemuese' => 'Ruebe');

# Als letztes fallen mir dann nur noch verschachtelte Arrays ein.
Kommentar von fluffiknuffi2
14.06.2016, 15:52

Ja assoziativ und die anderen sind die... "indexed" im Englischen, "indexbasierten" auf Deutsch?

Arrays in PHP sind ja keine reinen Arrays sondern Arrays mit Extra bzw. es werden verschiedene "Container"-Konzepte vereint: 

Ein Array in PHP ist tatsächlich eine geordnete Map

http://php.net/manual/de/language.types.array.php


1
Kommentar von 321abca
14.06.2016, 16:06

Also gibt es demnach 3 Arten / Strukturen von Arrays? Merk grad, dass meine Frage sehr unkonkret gestellt worden ist, aber ich habe eine Prüfung über Arrays und habe leider noch gar keine Ahnung von dem Thema. Alles was ich habe ist eine Inhaltsangabe, die ich versuche so gut wie möglich durchzuarbeiten. 

0

Was möchtest Du wissen?