====== Einführung in Arrays ====== Arrays sind in PHP ein ungemein praktisches Werkzeug. Sie kommen vor allem zum Einsatz, wenn sich Filter, eine Rotation oder eine Auswertung nicht mit den Standard-Funktionen erledigen lässt. Konkrete Beispiele für PHP-Code finden Sie in den jeweiligen Kapiteln, z.B. [[:de:create:rotation|Rotation]], [[:de:create:points|Punkte für Antworten zählen]], [[:de:create:filter-items|Items in eine anderen Frage übernehmen]]. ===== Arrays ===== Bei einem Array handelt es sich um eine Liste von Werten (z.B. Zahlen oder Texte). Der folgende PHP-Code erzeugt ein einfaches Array mit drei Listeneinträgen (in diesem Fall Texte): "eins", "zwei" und "drei". Das Array wird anschließend in der Variable $a abgelegt. // Ein Array anlegen $a = array('eins', 'zwei', 'drei'); Statt der Schreibweise ''array()'' ist auch eine Kurzschreibweise mit eckigen Klammern möglich. Die Funktion ist identisch. // Ein Array anlegen mit eckigen Klammern $a = ['eins', 'zwei', 'drei']; Die damit erzeugte Liste sieht aus wie folgt. Jeder Eintrag in der Liste erhält eine Nummer (den sogenannten Index oder Schlüssel), der i.d.R. bei 0 beginnt. Die Länge dieser Liste ist 3. ^Wert|eins|zwei|drei| ^Index| 0 | 1 | 2 | Mit eckigen Klammern (''[]'') kann man nun auf die einzelnen Einträge im Array zugreifen. Zwischen die Klammern wird einfach der Index geschrieben. Der Befehl ''count()'' verrät etwas über die Länge des Arrays. // Mit Arrays arbeiten $a = array('eins', 'zwei', 'drei'); html('

Länge des Arrays: '.count($a).'

'); html('

Eintrag mit Index 0: '.$a[0].'

'); html('

Eintrag mit Index 2: '.$a[2].'

');
Der Beispiel-Code erzeugt folgende Ausgabe im Fragebogen: Länge des Arrays: 3 Eintrag mit Index 0: eins Eintrag mit Index 2: drei **Tipp:** Sie sehen normalerweise nicht unmittelbar, was in einem Array gespeichert wurde. Verwenden Sie die Funktion ''debug()'', um es zu sehen. ''debug()'' erzeugt nur dann eine sichtbare Ausgabe, wenn Sie den Fragebogen im Debug-Modus starten (gelber Pfeil {{:button.debug.gif?nolink|Knopf zum Starten des Debug-Modus}}). $a = array() for ($i=0; $i<10; $i++) { $a[] = $i + 1; } debug($a); // Nur im Debug-Modus sichtbar! ===== Arrays Stück für Stück bauen ===== Besonders praktisch in PHP ist die Möglichkeit, einfach ein Element an das Array anzuhängen. Dazu schreibt man leere eckige Klammern hinter die Array-Variable und dann nach einem Gleichheitszeichen das, was an das Array angefügt werden soll: // Arrays erweitern $a = array('eins', 'zwei', 'drei'); $a[] = 'angehängt'; $a[] = 'noch eins'; Dieses Array hätte nun eine Länge von 5 Elementen und sieht wie folgt aus: ^Wert|eins|zwei|drei|angehängt|noch eins| ^Index| 0 | 1 | 2 | 3 | 4 | Besonders hilfreich klingt das zunächst noch nicht. Aber Arrays lassen sich optimal mit Schleifen kombinieren. Im folgenden Beispiel werden die Werte des obigen Arrays angeschrieben - beachten Sie, dass Sie 5 Werte mit einem einzigen Befehl in der Schleife verarbeiten können. // Arrays und Schleifen $a = array('eins', 'zwei', 'drei'); $a[] = 'angehängt'; $a[] = 'noch eins'; for ($i=0; $iElement '.$i.' = '.$a[$i].'

'); }
Der PHP-Code erzeugt folgende Ausgabe im Fragebogen: Element 0 = eins Element 1 = zwei Element 2 = drei Element 3 = angehängt Element 4 = noch eins Wenn Ihnen das immer noch nicht besonders hilfreich erscheint, denken Sie bitte an eine Mehrfachauswahl, welche Produkte eine Person üblicherweise einkauft. In einer Folgefrage sollen nun weitere Details zu den angekreuzten Produkten abgefragt werden, z.B. wie häufig man diese kauft. Soweit kein Problem mit ''getItems()'' -- aber sobald man noch zwei zusätzliche Produkte abfragen möchte, ist die oben geschilderte Funktionalität genau das Richtige. ===== Array-Funktionen ===== Nachfolgend werden einige Funktionen zur Arbeit mit Arrays vorgestellt, die im Fragebogen besonders häufig verwendet werden. Die Funktion ''**shuffle**(&array Array)'' mischt ein Array. Das ist nützlich, wenn man aus einer Liste zufällig einzelne Einträge heraussuchen möchte (s. [[:de:create:rotation|Rotation]]). $a = array('eins', 'zwei', 'drei', 'vier', 'fünf'); shuffle($a); html('

Zwei zufällig ausgesuchte Werte:
'. $a[0].' und '.$a[1]. '

');
Der Code erzeugt z.B. folgende Ausgabe im Fragebogen: Zwei zufällig ausgesuchte Werte: fünf und drei Im Gegenzug sortiert der Befehl ''**sort**(&array Array)'' das Array. Wenn man (wie im Beispiel) Texte verwendet, dann werden diese alphabetisch sortiert: $a = array('eins', 'zwei', 'drei', 'vier', 'fünf'); sort($a); for ($i=0; $iEintrag '.$i.' = '.$a[$i].'

'); }
Dieser PHP-Code erzeugt folgende Ausgabe im Fragebogen, die Werte wurden hier alphabetisch sortiert: Eintrag 0 = drei Eintrag 1 = eins Eintrag 2 = fünf Eintrag 3 = vier Eintrag 4 = zwei ===== Arrays zu einer Text-Liste zusammenfassen ===== Der Befehl ''**implode**(string //Trennzeichen//, array //Array//)'' verbindet alle Einträge des Arrays zu einem Text. Man kann als ersten Parameter angeben, durch welches Zeichen die Einträge getrennt werden sollen: $a = array('eins', 'zwei', 'drei', 'vier', 'fünf'); html('

Inhalt vorher: '.implode('|', $a).'

'); shuffle($a); html('

Inhalt nachher: '.implode('|', $a).'

'); html('

Inhalt mit Komma: '.implode(', ', $a).'

');
Der Code erzeugt z.B. folgende Ausgabe im Fragebogen: Inhalt vorher: eins|zwei|drei|vier|fünf Inhalt nachher: vier|zwei|eins|drei|fünf Inhalt mit Komma: vier, zwei, eins, drei, fünf ===== Array durchsuchen ===== Der Befehl ''**in_array**(mixed //Element//, array //Array//)'' überprüft, ob ein Element in einem Array vorhanden ist. Das ist vor allem dann nützlich, wenn man unterschiedliche Fragen stellt in Abhängigkeit von Array-Elementen. $a = array(1, 2, 7, 8); // Liste mit Zahlen (das könnten ebenso die angekreuzten Items sein) if (in_array(2, $a)) { question('AB01'); } if (in_array(3, $a)) { question('AB02'); } ===== Mengenlehre ===== Sie möchten die Items anfragen, die in einer vorhergehenden Frage angekreuzt wurden -- keinesfalls aber die Items 4 und 5? Dann können Sie mit ''array_diff()'' einfach die Items 4 und 5 aus der Liste entfernen. // Ausgewählte Items ermitteln $auswahl = getItems('AB01', 'min', 2); // Die Items 4 und 5 aus der Liste entfernen, falls vorhanden $never = array(4, 5); $items = array_diff($auswahl, $never); // Die Folgefrage stellen question('AB02', $items); Ähnlich hilfreich sind ''array_merge()'' (Vereinigungsmenge) und ''array_intersect()'' (Schnittmenge). ===== Assoziative Arrays ===== Gewöhnliche Arrays sind einfach eine Liste von Elementen, wobei jedes Element eine eindeutige Position hat. Diese Position wird durch den Index (''0'', ''1'', u.s.w) bezeichnet. Der Index wird auch als //Schlüssel// bezeichnet. Bei assoziativen Arrays gibt man die Schlüssel explizit vor. In PHP wird die Zuordnung eines Wertes zu einem Schlüssel durch die Zeichenfolge ''%%=>%%'' erreicht. Man __kann__ als Schlüssel natürlich den bekannten Index verwenden -- die Arrays ''$a'' und ''$b'' im folgenden Beispiel sind gleich. $a = array( 'eins', 'zwei', 'drei' ); $b = array( 0 => 'eins', 1 => 'zwei', 2 => 'drei' ); Aber als Schlüssel sind nicht nur Zahlen, sondern auch Strings erlaubt. Im folgenden Array wird damit z.B. für eine Reihe von Wissensfragen (vom Typ "Auswahl") die korrekte Antwort (Antwortcode) definiert. $c = array( 'AB01' => 2, 'AB02' => 1, 'BB01' => 5 ); Um das Element eines assoziativen Arrays auszulesen, wird der Schlüssel einfach in eckigen Klammern angegeben: $x = $c['AB01']; // oder auch $key = 'AB01'; $x = $c[$key]; Besonders hilfreich für die Arbeit mit assoziativen Arrays ist die PHP-interne Funktion ''[[http://php.net/manual/de/function.array-keys.php|array_keys()]]'' und die FOR-Schleife ''[[http://php.net/manual/de/control-structures.foreach.php|foreach]]''. Der folgende PHP-Code prüft für mehrere Fragen, ob die korrekte Antwort gegeben wurde ([[:de:create:points|Punkte für Antworten zählen]]). $c = array( 'AB01' => 2, 'AB02' => 1, 'BB01' => 5 ); foreach ($c as $label=>$correct) { if (value($label) == $correct) { html('

Die Antwort auf '.$label.' war korrekt.

'); } else { html('

Die Antwort auf '.$label.' war falsch.

'); } }
Eine reguläre FOR-Schleife kann man durch Einsatz von ''array_keys()'' verwenden: $c = array( 'AB01' => 2, 'AB02' => 1, 'BB01' => 5 ); $fragen = array_keys($c); for ($i=0; $iDie Antwort auf '.$label.' war korrekt.

'); } else { html('

Die Antwort auf '.$label.' war falsch.

'); } }
===== Weitere Array-Funktionen ===== Es gibt noch eine ganze Reihe weiterer Befehle für Arrays. Eine vollständige Liste finden Sie im offiziellen [[http://php.net/manual/de/ref.array.php|PHP Manual: Array-Funktionen]].