PHP: Index 0 in Arrays und die humanoide Syntax

tempa wrote this 21:13:

Ich wette, der Programmierer, der sich das mit dem Index „0“ für das erste Element im Array ausdachte, fand das tierisch clever und amüsant. Und weil das in der Welt der Programmierer fortan nun einmal so war und immer noch ist, dass man das erste Element eines Arrays mit $arrayVariable[0] anspricht und das letzte folglich mit $arrayVariable[$Anzahl-1], dürfen alle Manchmal~ und Gelegenheits-Programmierer sich ein Schleifchen an den Finger machen, damit sie diese Tatsache nicht vergessen. Ich für meinen Teil habe bei den ersten Zählübungen im zarten Toddler-Alter verinnerlicht, dass beim Zählen der Gummibärchen in der Hand, das Schnabulieren mit dem ersten Gummibär beginnt und nicht mit dem nullten. Daher zum Trotz und für ein gegrummeltes „Und Überhaupt!“:

  1. <?PHP
  2. $i = 1;
  3. $arrayVariable = array(
  4. $i++ => 'Erstes Element',
  5. $i++ => 'Zweites Element',
  6. $i++ => 'Drittes Element'
  7. );
  8. echo '<pre>$arrayVariable: ';
  9. print_r($arrayVariable);
  10. echo '</pre>';
  11. ?>

Und bei diesem Script stimmt die Ausgabe mit den Zählerfahrungen aus frühster Kindheit wieder überein:

$arrayVariable: Array
(
    [1] => Erstes Element
    [2] => Zweites Element
    [3] => Drittes Element
)

Für alle, die das erste Mal sich mit PHP beschäftigen und das mit der Null noch ganz neu ist, hier ein paar kleine Erläuterungen zum Skript:

<?php leitet ein PHP-Skript ein. Man kann auch nur <? schreiben, doch nicht alle Server lassen diese Kurzschreibweise zu. Mir ist noch keiner begegnet, der es nicht zugelassen hat, aber dann sind meine Programmierkenntnisse und Erfahrungen nicht unbedingt gigantisch. Im Anschluss in der Zeile zwei wird eine Variable definiert. Variablen in PHP werden mit dem Dollar-Zeichen $ eingeleitet. Variablen sind sensible und reagieren auf Unterschiede in der Groß- und Kleinschreibung. $myVar ist eine andere Variable als $myvar oder $myVAR. Wird der Variablen kein Wert zugewiesen (Die Zuweisung erfolgt über das einfache Gleichheitszeichen „=“ ), dann hat die Variable den Wert NULL. NULL ist mit Tucholsky gesprochen das Loch und die Variable ist das etwas, das Nichtloch ohne das das Loch nicht sein kann. NULL ist im Universum der Programmierer das Nichts, während „0etwas ist, das der Variable dem anderen Etwas (die Variable) zugeordnet, wie der Rand eines Loches und 0 ist der Korken. Gewöhnlich werden Zugewiesene Elemente mit einfachen oder doppelten Hochkommata eingeleitet, wobei in doppelten Hochkommata Variablen und andere Sonderzeichen als Variablen und Sonderzeichen erkannt werden in einfachen Hochkommata nicht. In meinem kleinen Skriptbeispiel für Anfänger fehlen sie die Hochkommata, was ich bei Zahlen machen darf. Da der Zahl ein Komma fehlt, nennt sich das Integer in den Manuals mit ‚int‘ abgekürzt und steht für Ganzzahl. Variablen dürfen auch Ausdrücke oder auch Methoden zugewiesen werden, was ich in der nächsten Variablen getan habe und mit dem Ausdruck array() gleich eine ganze Sammlung von Variablen zusammengefasst. In dieser Variablensammlung werden standardmäßig mit dem Komma-Delimiter ‚,‚ eine Variable von der anderen unterschieden, wobei jede Variable noch mit Hochkommatas umschlossen wird, so wie dies auch bei der Zuweisung außerhalb des Arrays geschieht. In meinem Array taucht die erste Variable, der ich die Ganzzahl 1 zugewiesen hatte wieder auf: $i++. Das doppelte Pluszeichen ist die Kurzschreibweise für $i = $i + 1;. Der Wert wird also beim Aufruf um eins erhöht. Und beim nächsten Aufruf in dem Array erneut, und erneut und erneut … Damit man die Variablen im Array ansprechen kann, benötigen diese einen Index. Wenn ich diesen nicht vergebe und einfach nur $meinArray = array('Erstens','Zweitens','Drittens'); schreibe, dann wird der Index automatisch vergeben. Zur Anschauung noch ein kleines Beispiel und diesmal gebe ich den Array nicht mit print_r() aus sondern mit var_dump() aus. Damit erhalte ich nicht nur die Werte der Variablen und den Index sondern auch den Variablen-Typ. Wer es nicht schon erahnt, bevor ich weiter mache noch rasch der handgemachte Index, bei dem ich bestimme, wie der Index (auch als ‚key‘ bezeichnet) lautet wird mit => erzeugt.

  1. <?php
  2. $var;
  3. $emptyVar = '';
  4. $defVar = 7;
  5. $myARRAY = array(NULL,0,1, '2','drei',"3,5",4.5, 'NULL', null,'5.5, 6',$var, $emptyVar, $defVar,"$defVar","$defVar",'$defVar',',',);
  6. echo '<pre>$arrayVariable: ';
  7. var_dump($myARRAY);
  8. echo '</pre>';
  9. ?>
$myARRAY: array(17) {
  [0]=>
  NULL
  [1]=>
  int(0)
  [2]=>
  int(1)
  [3]=>
  string(1) "2"
  [4]=>
  string(4) "drei"
  [5]=>
  string(3) "3,5"
  [6]=>
  float(4.5)
  [7]=>
  string(4) "NULL"
  [8]=>
  NULL
  [9]=>
  string(6) "5.5, 6"
  [10]=>
  NULL
  [11]=>
  string(0) ""
  [12]=>
  int(7)
  [13]=>
  string(1) "7"
  [14]=>
  string(1) "7"
  [15]=>
  string(7) "$defVar"
  [16]=>
  string(1) ","
}

Dem aufmerksamen Beobachter ist nun aufgefallen, dass da ein float(4.5) ist, das entspricht der Fließkommazahl 4,5 im Deutschen. Der aufmerksame Beobachter sieht auch die Unterschiede zwischen mit und ohne Hochkommata und einfachen und doppelten Hochkommata und wie man mit einem Backslash ‚‚ verhindern kann, dass in doppelten Hochkommata der Wert der Variablen ausgegeben wird und statt dessen das Dollarzeichen samt Variablenname ausgegeben wird. Und dem aufmerksamen Beobachter ist die eckige Klammer nicht entgangen. Die eckige Klammer enthält den Schlüssel. Will man ein gezieltes Element aus seinem Array herauspicken, dann erreicht man das mit der folgenden Schreibweise: $arrayVariable["key"]. Ist der Schlüssel (=key = index) eine Ganzzahl (=int = integer), dann kann man die Anführungszeichen weglassen. Für die Variablen in einem Array gilt, was für ganz normale Variablen gilt. Ein Element in einem Array kann ein Array sein. Ich kann Arrays schachteln. $myArray = array(array(element1, element2, ...), array(element1, element2, ...), ...). Um nun das Element 1 im ersten Array anzusprechen muss ich erst das Array-Element über den Schlüssel in der eckigen Klammer ansprechen und dann über die nächste eckige Klammer das erste Element im ersten Array-Element über den entsprechenden Schlüssel des Array-Elementes: $myArray[key][key].

Nach all der trockenen Theorie noch ein kleines Praktisches Anwendungsgebiet, um viel Schreiberei zu sparen und Daten kompakt an einem Ort zu listen und nicht zwischen dem HLMT-Gewusel suchen zu müssen. 😉 Den Array in einer ungeordnete Liste in XHTML überführen:

  1. <?php
  2. $i = 1;
  3. $myGallery = array(
  4. $i++ =>array(
  5. imgData => $imgUrl.'img1',
  6. imgExt => 'png',
  7. imgAlt => 'Bildbezeichnung1',
  8. imgZiel => $artikelPath.'Bildkritik1'
  9. ),
  10. $i++ =>array(
  11. imgData => $imgUrl.'img2',
  12. imgExt => 'png',
  13. imgAlt => 'Bildbezeichnung2',
  14. imgZiel => $artikelPath.'Bildkritik2'
  15. ),
  16. etc. ...
  17. $i++ =>array(
  18. imgData => $imgUrl.'img[n]',
  19. imgExt => 'png',
  20. imgAlt => 'Bildbezeichnung[n]',
  21. imgZiel => $artikelPath.'Bildkritik[n]'
  22. )
  23. );
  24. $j = count($myGallery);
  25. ?>
  26. <ul>
  27. <?php
  28. for($x=1; $x<=$j; $x++){
  29. echo "<li><a href='".$myGallery[$x]['imgZiel']."' ><img src='".$myGallery[$x]['imgData'].$myGallery[$x]['imgExt']."' alt='".$myGallery[$x]['imgAlt']."' /></a></li>";
  30. }
  31. ?>
  32. </ul>

Was ist nun noch neues dazugekommen?

Zeile 5: imgData => $imgUrl.'img[n]', beachten die den schnuckeligen kleinen Punkt. Mit ihm klebt man Strings zusammen und kann so diese nach einander Reihen. Hier spare ich mir die Wiederholdung des Pfades zum Bildordner, der immer gleich ist.

Zeile 24: $j = count($myGallery);. Das ist eine interne PHP-Funktion, die die Elemente in einem Array zählt. Bei unserem verschachtelten Array zählt er die Arrays nicht aber was in dem Array ist. Erst $n = count($myGallery['1']); würde zählen was in dem Array mit dem Schlüssel (=key = index) '1! ist und käme auf den Wert '4'.

Zeile 25-27: PHP arbeitet immer zwischen seinem Anfang und seinem Ende. Ich kann jederzeit rein und raus springen, d.h. fast immer. Innerhalb von PHP-Klassen darf ich das nicht, aber das kommt erst viel später, wenn man sich mit objektorientierten PHP beschäftigt. Davor, dazwischen und danach kann ich ganz profanes (X)HTML schreiben.

Zeile 28: Die for-Schleife for(Startbedingung,Schlußbedingung,Forwärtsbewegung){Funktion};. Zunächst einmal habe ich mit $x=1; die Startbedingung festgelegt. Das erste Mal, wenn die Schleife in die geschweifte Klammer hineinspringt und die darin befindlichen Anweisungen (=Funktionen, Methoden) ausführt, hat die Variable $x den Wert '1' und da die Variable $x den Schlüssel (= key = index) bestimmt $myGallery[$x] schnappt sich das Programm den Wert des entsprechenden Array-Elementes in unserem Fall einen Array, weswegen gleich noch ein zweiter Schlüssel angehängt wird, für den wir zur leichten Erkennung und Zuweisung einen String-Index wählten, der uns verrät was dahintersteckt. Mit diesen Bausteinen bauen wir unsere HTML-Zeile zusammen. Und weil in einer for-Schleife der Vorgang solange wiederholt wird, bis die Schlußbedingung erfüllt ist, also wie in unserem Falle Unsere Variable $x der Anzahl unserer Arrays mit den Bilddaten entspricht.

Natürlich kann man das ganze noch kompakter gestalten und auf den Gag mit der 1 verzichten, dann liest sich der Array wie folgt:

  1. $myGallery = array(array(img1,ext1,Bez1,Url1),array(img2,ext2,Bez2,Url2), etc.)

Die for-Schleife verändert sich dabei ebenfalls etwas:

  1. $j = count($myGallery);
  2. for($x=0; $x<$j; $x++){ ... };

Count() zählt vier Elemente, der Index aber geht nur bis drei. Also bleibt darunter und ist damit nicht kleiner gleich sondern eben nur kleiner.

Ebenso verändert sich der Zusammenbau der Quelltextbausteine:

  1. echo "<li><a href='".$myGallery[$x][3]."' ><img src='".$myGallery[$x][0].$myGallery[$x][1]."' alt='".$myGallery[$x][2]."' /></a></li>";

Man beachte das 0, 1, 2, 3 ... man stelle sich einfach vor, dass als man noch ganz klein war und der große Bruder auf geheiß der Mutter die Tüte Gummibärchen teilen musste, dass er als er die Bärchen in das kleine Händchen zählte, er mit der Zahl 0 das erste Bärchen knurrend übergab. Dann klappts schon irgendwie.

Viel Spaß mit dem ersten eigenen tatsächlich nützlichen PHP-Programm. 😀 Eine erste Lektion beinah ohne echo 'Hallo Welt.';

2 Responses to “PHP: Index 0 in Arrays und die humanoide Syntax”

  1. Mathias Bank Says:

    hehe, du bist nicht die erste, die sich damit anlegt. Es gibt auch einige Programmiersprachen, die von 1 anfangen zum zählen (z.B. matlab). Aber die Wahl von 0 ist nicht zufällig. Sie macht nämlich genau dann Sinn, wenn man mit Array-Strukturen arbeitet. Und zwar fällt dir das auf, wenn du substr verwendest. Daher kommt das ursprünglich. Da dachte man noch weniger an Array-Berechnungen sondern noch vielmehr an die Verarbeitung von Zeichenketten.

    Aber das Streitgespräch ist so ähnlich wie für den Mathematiker, ob die positiven Zahlen erst bei 1 anfangen oder schon bei 0. Für Informatiker standardmäßig einfach bei 0 (ich hasse Programmiersprachen, die von 1 anfangen, muss man immer umdenken).

  2. Silke Schümann Says:

    Wie Du schreibst, es ist eine Frage der Definition und man gewöhnt sich sicherlich daran. Als Programmiervermeiderin, entwickeln sich meine Kenntnisse nur sehr langsam und Sinn und Unsinn von Index „0“ erschließt sich mir einfach nicht. Jedes Ding, das mich soviel Anstrengung kostet, es zu beachten, verdient ein wenig Sticheln.

    Außerdem hilft mir der Beitrag, das nächste Mal es nicht wieder zu vergessen. Und der Inhalt ist für absolute Neulinge geeignet. Ich hätte mir eine erste Lektion wie diese gewünscht, als ich mich auf die Suche nach Tutorials machte.

    Die meisten halten sich mit viel zu viel theoretischem Kram auf. Bis man das erste Mal im Lernprozess etwas vernünftiges anfangen kann, vergehen Stunden. Mit diesem Beitrag kann man innerhalb von einer halben Stunde erste eigene nützlich Dinge mit PHP anfangen und hat so ziemlich das wesentliche gelernt, was andere mit $var = "hallo Welt" vermitteln.

    Was substr() betrifft, so habe ich es schon angewendet, aber so ganz dessen Möglichkeiten und wieso jetzt bei substr 0 besser als 1 ist, … NULL Ahnung.

Leave a Reply