====== 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.

<code php>
// Ein Array anlegen
$a = array('eins', 'zwei', 'drei');
</code>

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.

<code php>
// Mit Arrays arbeiten
$a = array('eins', 'zwei', 'drei');
html('<p>Länge des Arrays: '.count($a).'</p>');
html('<p>Eintrag mit Index 0: '.$a[0].'</p>');
html('<p>Eintrag mit Index 2: '.$a[2].'</p>');
</code>

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}}).

<code php>
$a = array()
for ($i=0; $i<10; $i++) {
  $a[] = $i + 1;
}
debug($a);  // Nur im Debug-Modus sichtbar!
</code>


===== 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:

<code php>
// Arrays erweitern
$a = array('eins', 'zwei', 'drei');
$a[] = 'angehängt';
$a[] = 'noch eins';
</code>

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.

<code php>
// Arrays und Schleifen
$a = array('eins', 'zwei', 'drei');
$a[] = 'angehängt';
$a[] = 'noch eins';

for ($i=0; $i<count($a); $i++) {
  html('<p>Element '.$i.' = '.$a[$i].'</p>');
}
</code>

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]]).

<code php>
$a = array('eins', 'zwei', 'drei', 'vier', 'fünf');
shuffle($a);
html('<p>Zwei zufällig ausgesuchte Werte:<br>'. $a[0].' und '.$a[1]. '</p>');
</code>

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:

<code php>
$a = array('eins', 'zwei', 'drei', 'vier', 'fünf');
sort($a);

for ($i=0; $i<count($a); $i++) {
  html('<p>Eintrag '.$i.' = '.$a[$i].'</p>');
}
</code>

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:

<code php>
$a = array('eins', 'zwei', 'drei', 'vier', 'fünf');
html('<p>Inhalt vorher: '.implode('|', $a).'</p>');
shuffle($a);
html('<p>Inhalt nachher: '.implode('|', $a).'</p>');
html('<p>Inhalt mit Komma: '.implode(', ', $a).'</p>');
</code>

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.

<code php>
$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');
}
</code>


===== 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.

<code php>
// 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);
</code>

Ä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.

<code php>
$a = array(
  'eins',
  'zwei',
  'drei'
);

$b = array(
  0 => 'eins',
  1 => 'zwei',
  2 => 'drei'
);
</code>

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.

<code php>
$c = array(
  'AB01' => 2,
  'AB02' => 1,
  'BB01' => 5
);
</code>


Um das Element eines assoziativen Arrays auszulesen, wird der Schlüssel einfach in eckigen Klammern angegeben:

<code php>
$x = $c['AB01'];
// oder auch
$key = 'AB01';
$x = $c[$key];
</code>

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]]).

<code php>
$c = array(
  'AB01' => 2,
  'AB02' => 1,
  'BB01' => 5
);
foreach ($c as $label=>$correct) {
  if (value($label) == $correct) {
    html('<p style="color: green">Die Antwort auf '.$label.' war korrekt.</p>');
  } else {
    html('<p style="color: red">Die Antwort auf '.$label.' war falsch.</p>');
  }
}
</code>

Eine reguläre FOR-Schleife kann man durch Einsatz von ''array_keys()'' verwenden:

<code php>
$c = array(
  'AB01' => 2,
  'AB02' => 1,
  'BB01' => 5
);
$fragen = array_keys($c);
for ($i=0; $i<count($fragen); $i++) {
  $label = $fragen[$i];
  $correct = $c[$label];
  if (value($label) == $correct) {
    html('<p style="color: green">Die Antwort auf '.$label.' war korrekt.</p>');
  } else {
    html('<p style="color: red">Die Antwort auf '.$label.' war falsch.</p>');
  }
}
</code>


===== 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]].