1
0
mirror of https://github.com/php/doc-de.git synced 2026-04-29 09:53:30 +02:00
Files
archived-doc-de/language/types/array.xml
T
Christoph Michael Becker 8cb2ade13e committed typo fix contributed by anon user
git-svn-id: https://svn.php.net/repository/phpdoc/de/trunk@336631 c90b9560-bf6c-de11-be94-00142212c4b1
2015-04-23 12:08:54 +00:00

1144 lines
31 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: f616f360e1988ed68d5120e1c43e1e473a5b9e13 Maintainer: simp Status: working -->
<sect1 xml:id="language.types.array">
<title>Arrays</title>
<para>
Ein <type>Array</type> in PHP ist tatsächlich eine geordnete Map. Eine Map ist ein
Typ, der <emphasis>Werte</emphasis> zu <emphasis>Schlüsseln</emphasis> zuordnet.
Dieser Typ ist für einige verschiedene Nutzungsarten optimiert. Er kann als ein
Array verwendet werden, als Liste (Vektor), Hash Table (eine Implementierung einer
Map), Dictionary, Collection, Stack, Queue und wahrscheinlich noch andere.
Da ein Wert eines <type>Array</type>s ein weiteres <type>Array</type> sein kann
sind auch Bäume und mehrdimensionale <type>Array</type>s möglich.
</para>
<para>
Die Erläuterung dieser Datenstrukturen ist nicht im Rahmen dieses Handbuches,
aber wenigstens ein Beispiel für jedes ist hier angegeben. Um weitere Informationen
zu erhalten wird auf die immense Literatur zu diesem weiten Feld verwiesen.
</para>
<sect2 xml:id="language.types.array.syntax">
<title>Syntax</title>
<sect3 xml:id="language.types.array.syntax.array-func">
<title>Spezifizierung mittels <function>array</function></title>
<para>
Ein <type>Array</type> kann durch das Sprachkonstrukt <function>array</function>
erzeugt werden. Dies nimmt eine beliebige Anzahl kommaseparierter
<literal><replaceable>Schlüssel</replaceable> =&gt; <replaceable>Wert</replaceable></literal>-
Paare als Parameter entgegen.
</para>
<synopsis>
array(
<optional><replaceable>Schlüssel</replaceable> =&gt; </optional><replaceable>Wert</replaceable>,
<optional><replaceable>Schlüssel2</replaceable> =&gt; </optional><replaceable>Wert2</replaceable>,
<optional><replaceable>Schlüssel3</replaceable> =&gt; </optional><replaceable>Wert3</replaceable>,
...
)</synopsis>
<!-- Do not fix the whitespace for the synopsis end element. A limitation of PhD prevents proper trimming -->
<para>
Das Komma nach dem letzten Array-Element ist optional und kann weggelassen werden. Dies wird
üblicherweise in einzeiligen Arrays getan, d.h. <literal>array(1, 2)</literal> wird der
Schreibweise <literal>array(1, 2, )</literal> vorgezogen. Andererseits wird bei mehrzeiligen
Arrays wird das Komma am Ende üblicherweise genutzt, da dies ein einfaches Hinzufügen weiterer
Elemente am Ende erlaubt.
</para>
<para>
Seit PHP 5.4 kann auch eine kurze Array-Syntax verwendet werden, welche
<literal>array()</literal> durch <literal>[]</literal> ersetzt.
</para>
<example>
<title>Ein einfaches Array</title>
<programlisting role="php">
<![CDATA[
<?php
$array = array(
"foo" => "bar",
"bar" => "foo",
);
// seit PHP 5.4
$array = [
"foo" => "bar",
"bar" => "foo",
];
?>
]]>
</programlisting>
</example>
<para>
Der <replaceable>Schlüssel</replaceable> kann entweder ein <type>Integer</type>
oder ein <type>String</type> sein. Der <replaceable>Wert</replaceable> kann
beliebige Datentypen annehmen.
</para>
<para>
Zusätzlich werden die folgenden Typkonvertierungen auf den
<replaceable>Schlüssel</replaceable> angewendet:
<itemizedlist>
<listitem>
<simpara>
<type>String</type>s die einen gültigen <type>Integer</type> enthalten werden
zum entsprechenden <type>Integer</type> umgewandelt. Beispielsweise wird der
Schlüssel <literal>"8"</literal> tatsächlich unter <literal>8</literal>
gespeichert. Andererseits wird <literal>"08"</literal> nicht umgewandelt, da
dies kein gültiger Ganzzahlwert ist.
</simpara>
</listitem>
<listitem>
<simpara>
<type>Float</type>s werden ebenfalls zu <type>Integer</type> umgewandelt, was ein
Abschneiden des Dezimalbruches zur Folge hat. Beispielsweise wird der Schlüssel
<literal>8.7</literal> als <literal>8</literal> gespeichert.
</simpara>
</listitem>
<listitem>
<simpara>
<type>Bool</type>s werden ebenfalls zu <type>Integer</type> umgewandelt, d.h.
der Schlüssel <literal>true</literal> wird unter <literal>1</literal>
gespeichert und der Schlüssel <literal>false</literal> unter <literal>0</literal>.
</simpara>
</listitem>
<listitem>
<simpara>
<type>Null</type> wird zu einem leeren String umgewandelt, d.h. der Schlüssel
<literal>null</literal> wird tatsächlich unter <literal>""</literal> gespeichert.
</simpara>
</listitem>
<listitem>
<simpara>
Werte vom typ <type>Array</type> oder <type>Object</type> können nicht als Schlüssel
verwendet werden. Ein Versuch dies zu tun wird die Warnung
<literal>Illegal offset type</literal> zur Folge haben.
</simpara>
</listitem>
</itemizedlist>
</para>
<para>
Wenn mehrere Elemente in einer Array-Deklaration den gleichen Schlüssel verwenden,
dann wird nur der letzte verwendet und alle weiteren überschrieben.
</para>
<example>
<title>Beispiel für Typenumwandlung und Überschreibung</title>
<programlisting role="php">
<![CDATA[
<?php
$array = array(
1 => "a",
"1" => "b",
1.5 => "c",
true => "d",
);
var_dump($array);
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
array(1) {
[1]=>
string(1) "d"
}
]]>
</screen>
<para>
Da alle Schlüssel im obigen Beispiel zu <literal>1</literal> umgewandelt werden, wird der Wert
dieses Elements durch jeden angegebenen Wert überschrieben und nur der letzte zugewiesene
Wert <literal>"d"</literal> bleibt übrig.
</para>
</example>
<para>
Arrays können in PHP gleichzeitig Schlüssel der Typen <type>Integer</type> und
<type>String</type> enthalten, da PHP nicht zwischen indizierten und
assoziativen Arrays unterscheidet.
</para>
<example>
<title>Gemischte <type>Integer</type> und <type>String</type> Schlüssel</title>
<programlisting role="php">
<![CDATA[
<?php
$array = array(
"foo" => "bar",
"bar" => "foo",
100 => -100,
-100 => 100,
);
var_dump($array);
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
array(4) {
["foo"]=>
string(3) "bar"
["bar"]=>
string(3) "foo"
[100]=>
int(-100)
[-100]=>
int(100)
}
]]>
</screen>
</example>
<para>
Die Angabe des <replaceable>Schlüssel</replaceable> ist optional.Ist keiner angegeben,
so wird PHP den bisher größten angegebenen <type>Integer</type> Schlüssel erhöhen
und das Ergebnis als Schlüssel verwenden.
</para>
<example>
<title>Indizierte Arrays ohne Schlüssel</title>
<programlisting role="php">
<![CDATA[
<?php
$array = array("foo", "bar", "hello", "world");
var_dump($array);
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
array(4) {
[0]=>
string(3) "foo"
[1]=>
string(3) "bar"
[2]=>
string(5) "hello"
[3]=>
string(5) "world"
}
]]>
</screen>
</example>
<para>
Es ist auch möglich den Schlüssel nur bei einigen Elementen anzugeben:
</para>
<example>
<title>Schlüssel nicht bei allen Elementen</title>
<programlisting role="php">
<![CDATA[
<?php
$array = array(
"a",
"b",
6 => "c",
"d",
);
var_dump($array);
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
array(4) {
[0]=>
string(1) "a"
[1]=>
string(1) "b"
[6]=>
string(1) "c"
[7]=>
string(1) "d"
}
]]>
</screen>
<para>
Wie Sie sehen können wurde dem letzten Wert <literal>"d"</literal> der
Schlüssel <literal>7</literal> zugewiesen. Dies erfolgte da der größte
vorherige ganzzahlige Schlüssel die <literal>6</literal> war.
</para>
</example>
</sect3>
<sect3 xml:id="language.types.array.syntax.accessing">
<title>Zugriff auf Elemente mit eckigen Klammern</title>
<para>
Auf Elemente eines Arrays kann durch Verwendung der Syntax
<literal>array[Schlüssel]</literal> zugegriffen werden.
</para>
<example>
<title>Zugriff auf Array-Elemente</title>
<programlisting role="php">
<![CDATA[
<?php
$array = array(
"foo" => "bar",
42 => 24,
"multi" => array(
"dimensional" => array(
"array" => "foo"
)
)
);
var_dump($array["foo"]);
var_dump($array[42]);
var_dump($array["multi"]["dimensional"]["array"]);
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
string(3) "bar"
int(24)
string(3) "foo"
]]>
</screen>
</example>
<note>
<para>
Sowohl eckige als auch geschweifte Klammern können verwendet werden, um auf
die Elemente eines Arrays zuzugreifen (z.B. werden im obigen Beispiel
<literal>$array[43]</literal> und <literal>array{42}</literal> auf das gleiche
Element zugreifen).
</para>
</note>
<para>
Seit PHP 5.4 ist es möglich ein Array aus dem Rückgabewert eines Funktion
direkt zu dereferenzieren. Vorher war dies nur über temporäre Variablen
möglich.
</para>
<para>
Seit PHP 5.5 ist es möglich ein Array-Literal zu dereferenzieren.
</para>
<example>
<title>Array-Dereferenzierung</title>
<programlisting role="php">
<![CDATA[
<?php
function getArray() {
return array(1, 2, 3);
}
// seit PHP 5.4
$secondElement = getArray()[1];
// vorher
$tmp = getArray();
$secondElement = $tmp[1];
// oder
list(, $secondElement) = getArray();
?>
]]>
</programlisting>
</example>
<note>
<para>
Der Versuch auf einen nicht definierten Arrayschlüssel zuzugreifen
ist gleichwertig zum Zugriff jeder anderen undefinierten Variable:
Ein Fehler der Stufe <constant>E_NOTICE</constant> wird ausgegeben
und das Ergebnis ist &null;.
</para>
</note>
</sect3>
<sect3 xml:id="language.types.array.syntax.modifying">
<title>Anlegen/Ändern mit eckigen Klammern</title>
<para>
Ein bestehendes <type>Array</type> kann verändert werden, indem man
explizit Werte darin setzt.
</para>
<para>
Dies wird getan, indem man Werte dem <type>Array</type> zuweist und dabei
den Schlüssel in eckigen Klammern angibt. Der Schlüssel kann dabei weggelassen
werden, woraus ein leeres Klammernpaar resultiert (<literal>[]</literal>).
</para>
<synopsis>
$arr[<replaceable>Schlüssel</replaceable>] = <replaceable>Wert</replaceable>;
$arr[] = <replaceable>Wert</replaceable>;
// <replaceable>Schlüssel</replaceable> kann ein <type>Integer</type> oder <type>String</type> sein
// <replaceable>Wert</replaceable> kann einen beliebigen Typen haben</synopsis>
<para>
Falls <varname>$arr</varname> noch nicht existiert wird es erzeugt, dies ist
also eine alternative Methode, um ein <type>Array</type> zu erzeugen. Dieses
Vorgehen wird jedoch nicht empfohlen, da falls <varname>$arr</varname> bereits
einen Wert enthält (z.B. ein <type>String</type> aus einer Requestvariablen)
bleibt dieser Wert bestehen und <literal>[]</literal> kann tatsächlich für den
<link linkend="language.types.string.substr">String-Zugriffs-Operator</link>
stehen. Es ist immer besser eine Variable durch direkte Zuweisung zu initialisieren.
</para>
<para>
Um einen bestimmten Wert zu ändern, kann man einen Wert zum Element anhand dessen
Schlüssel zuweisen. Um ein Schlüssel-Wert-Paar zu entfernen, kann man die Funktion
<function>unset</function> darauf anwenden.
</para>
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
$arr = array(5 => 1, 12 => 2);
$arr[] = 56; // Dies ist das selbe wie $arr[13] = 56;
// an dieser Stelle im Programmablauf
$arr["x"] = 42; // Dies fügt ein neues Element zum Array
// mit dem Schlüssel "x" hinzu
unset($arr[5]); // Dies entfernt das Element aus dem
// Array
unset($arr); // Dies löscht das gesamte Array
?>
]]>
</programlisting>
</informalexample>
<note>
<para>
Wie vorher bereits erwähnt wird das Maximum der bestehenden Schlüssel vom
Typ <type>Integer</type> verwendet, wenn kein Schlüssel angegeben ist, und der
neue Schlüssel wird das Maximum plus 1 sein (aber mindestens 0). Wenn noch kein
<type>Integer</type>-Schlüssel existiert wird der schlüssel <literal>0</literal>
(Null) verwendet.
</para>
<para>
Beachten Sie, dass der Maximalwert der Integer-Schlüssel dafür
<emphasis>aktuell nicht im <type>Array</type> existieren muss</emphasis>.
Er muss nur zu einem vorherigen Zeitpunkt im <type>Array</type>
existiert haben seitdem das <type>Array</type> zuletzt neu
indiziert wurde. Das folgende Beispiel erläutert dies:
</para>
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
// Create a simple array.
$array = array(1, 2, 3, 4, 5);
print_r($array);
// Nun wird jeder Wert gelöscht, aber das Array selbst bleibt bestehen
foreach ($array as $i => $value) {
unset($array[$i]);
}
print_r($array);
// Ein Element wird hinzugefügt
// (Beachten Sie, dass der neue Schlüssel 5 ist statt 0)
$array[] = 6;
print_r($array);
// Neue Indizierung
$array = array_values($array);
$array[] = 7;
print_r($array);
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
)
Array
(
)
Array
(
[5] => 6
)
Array
(
[0] => 6
[1] => 7
)
]]>
</screen>
</informalexample>
</note>
</sect3>
</sect2><!-- end syntax -->
<sect2 xml:id="language.types.array.useful-funcs">
<title>Nützliche Funktionen</title>
<para>
Es gibt einige nützliche Funktionen für die Arbeit mit Arrays, die
im Abschnitt <link linkend="ref.array">Array-Funktionen</link>
nachgeschlagen werden können.
</para>
<note>
<para>
Die Funktion <function>unset</function> erlaubt es Schlüssel aus einem
<type>Array</type> zu entfernen. Beachten Sie dabei, dass das Array
<emphasis>nicht</emphasis> neu indiziert wird. Falls ein echtes Verhalten
von "entfernen und verschieben" gewünscht ist, dann kann das
<type>Array</type> mittels <function>array_values</function> neu
indiziert werden.
</para>
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
$a = array(1 => 'one', 2 => 'two', 3 => 'three');
unset($a[2]);
/* dies wird ein Array erzeugen, dass wie folgt definiert wäre
$a = array(1 => 'one', 3 => 'three');
und nicht so
$a = array(1 => 'one', 2 =>'three');
*/
$b = array_values($a);
// Nun ist $b array(0 => 'one', 1 =>'three')
?>
]]>
</programlisting>
</informalexample>
</note>
<para>
Die Kontrollstruktur &foreach; existiert speziell für <type>Array</type>s.
Sie bietet eine einfache Möglichkeit, ein <type>Array</type> zu durchlaufen.
</para>
</sect2>
<sect2 xml:id="language.types.array.donts">
<title>Do's und Dont's für Arrays</title>
<sect3 xml:id="language.types.array.foo-bar">
<title>Wieso ist <literal>$foo[bar]</literal> falsch?</title>
<para>
Verwenden Sie immer Anführungszeichen um ein Zeichenkettenliteral des Index
eines Arrays. Beispielsweise ist <literal>$foo['bar']</literal> richtig,
<literal>$foo[bar]</literal> hingegen nicht. Aber wieso nicht? Es ist
üblich die folgende Schreibweise in alten Skripten zu finden:
</para>
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
$foo[bar] = 'enemy';
echo $foo[bar];
// etc
?>
]]>
</programlisting>
</informalexample>
<para>
Dies ist falsch, funktioniert aber. Der Grund dafür ist, dass dieser Code
eine undefinierte Konstante (bar) anstatt eines <type>String</type>
verwendet ('bar' - beachten Sie die Anführungszeichen).
PHP kann zukünftig Konstanten definieren die zum Leidwesen dieses Codes
den gleichen Namen haben könnten. Dies funktioniert, da PHP automatisch
einen <emphasis>nackten String</emphasis> (ein <type>String</type> ohne
Anführungszeichen welcher nicht einem bekannten Symbol entspricht) in einen
<type>String</type> umwandelt, welcher den nackten <type>String</type>
enthält. Beispielsweise wird, wenn keine Konstante namens
<constant>bar</constant> definiert ist, PHP diese automatisch durch
den <type>String</type> <literal>'bar'</literal> ersetzen und verwenden.
</para>
<note>
<simpara>
Dies bedeutet nicht, dass man den Schlüssel <emphasis>immer</emphasis> in
Anführungszeichen schreiben muss. Schreiben Sie keine Schlüssel in
Anführungszeichen, welche <link linkend="language.constants">Konstanten</link>
oder <link linkend="language.variables">Variablen</link> sind, da dies PHP
daran hindern wird diese zu interpretieren.
</simpara>
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
error_reporting(E_ALL);
ini_set('display_errors', true);
ini_set('html_errors', false);
// Simples Array:
$array = array(1, 2);
$count = count($array);
for ($i = 0; $i < $count; $i++) {
echo "\nPrüfe $i: \n";
echo "Schlecht: " . $array['$i'] . "\n";
echo "Gut: " . $array[$i] . "\n";
echo "Schlecht: {$array['$i']}\n";
echo "Gut: {$array[$i]}\n";
}
?>
]]>
</programlisting>
</informalexample>
&example.outputs;
<screen>
<![CDATA[
Prüfe 0:
Notice: Undefined index: $i in /path/to/script.html on line 9
Schlecht:
Gut: 1
Notice: Undefined index: $i in /path/to/script.html on line 11
Schlecht:
Gut: 1
Prüfe 1:
Notice: Undefined index: $i in /path/to/script.html on line 9
Schlecht:
Gut: 2
Notice: Undefined index: $i in /path/to/script.html on line 11
Schlecht:
Gut: 2
]]>
</screen>
</note>
<para>
Weitere Beispiele zur Erläuterung dieses Verhaltens:
</para>
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
// Alle Fehler anzeigen
error_reporting(E_ALL);
$arr = array('fruit' => 'apple', 'veggie' => 'carrot');
// Korrekt
print $arr['fruit']; // apple
print $arr['veggie']; // carrot
// Inkorrekt. Dies Funktioniert, aber PHP wirft einen Fehler der Stufe
// E_NOTICE, da eine undefinierte Konstante namens fruit verwendet wird
//
// Notice: Use of undefined constant fruit - assumed 'fruit' in...
print $arr[fruit]; // apple
// Dies definiert eine Konstante, um darzustellen was hier passiert. Der Wert
// 'veggie' wird einer Konstanten namens fruit zugewiesen
define('fruit', 'veggie');
// Beachten Sie nun den Unterschied
print $arr['fruit']; // apple
print $arr[fruit]; // carrot
// Hier ist es in Ordnung, da dies innerhalb eines String ist. Innerhalb eines
// Strings wird nicht nach Konstanten gesucht, weshalb kein E_NOTICE auftritt
print "Hello $arr[fruit]"; // Hello apple
// Mit einer Ausnahme: Klammern um ein Array sorgen dafür, dass Konstanten
// interpretiert werden
print "Hello {$arr[fruit]}"; // Hello carrot
print "Hello {$arr['fruit']}"; // Hello apple
// Dies wird nicht funktionieren und zu einem Parser Fehler führen:
// Parse error: parse error, expecting T_STRING' or T_VARIABLE' or T_NUM_STRING'
// Dies gilt natürlich ebenso für superglobale Werte innerhalb von Strings
print "Hello $arr['fruit']";
print "Hello $_GET['foo']";
// Konkatenation ist eine weitere Möglichkeit
print "Hello " . $arr['fruit']; // Hello apple
?>
]]>
</programlisting>
</informalexample>
<para>
Wenn <link linkend="ini.error-reporting">error_reporting</link> so eingestellt
wird, dass Fehler der Stufe <constant>E_NOTICE</constant> angezeigt werden
(indem man es auf <constant>E_ALL</constant> stellt), so wird diese Verwendung
sofort sichtbar. Standardmäßig ist
<link linkend="ini.error-reporting">error_reporting</link> nicht entsprechend
eingestellt, um solche Hinweise zu zeigen.
</para>
<para>
Wie im Anschnitt zur <link linkend="language.types.array.syntax">Syntax</link>
gezeigt muss der Inhalt der eckigen Klammern '<literal>[</literal>' und
'<literal>]</literal>') ein Ausdruck sein. Das bedeutet dass folgendes funktioniert:
</para>
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
echo $arr[somefunc($bar)];
?>
]]>
</programlisting>
</informalexample>
<para>
Dieses Beispiel zeigt, wie der Rückgabewert einer Funktion als Arrayindex verwendet
wird. PHP kann auch Konstanten auflösen:
</para>
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
$error_descriptions[E_ERROR] = "A fatal error has occurred";
$error_descriptions[E_WARNING] = "PHP issued a warning";
$error_descriptions[E_NOTICE] = "This is just an informal notice";
?>
]]>
</programlisting>
</informalexample>
<para>
Beachten Sie, dass <constant>E_ERROR</constant> ein gültiger Bezeichner ist,
genau wie <literal>bar</literal> im ersten Beispiel. Das vorherige Beispiel ist
gleichbedeutend mit:
</para>
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
$error_descriptions[1] = "A fatal error has occurred";
$error_descriptions[2] = "PHP issued a warning";
$error_descriptions[8] = "This is just an informal notice";
?>
]]>
</programlisting>
</informalexample>
<para>
da <constant>E_ERROR</constant> gleich <literal>1</literal> ist usw.
</para>
<sect4 xml:id="language.types.array.foo-bar.why">
<title>Wieso ist es also schlecht?</title>
<para>
Irgendwann in der Zukunft könnte das PHP-Team eine weitere Konstante
oder ein Schlüsselwort hinzufügen oder eine Kostante in anderem Code
könnte Einfluss nehmen. Es ist beispielsweise bereits falsch die Wörter
<literal>empty</literal> oder <literal>default</literal> so zu schreiben,
da dies <link linkend="reserved">reservierte Schlüsselwörter</link> sind.
</para>
<note>
<simpara>
Zur Wiederholung: innerhalb eines <type>String</type> in doppelten
Anführungszeichen ist es korrekt einen Arrayschlüssel ohne Anführungszeichen
zu schreiben wie <literal>"$foo[bar]"</literal>. Die obigen Beispiele
erklären dies ebenso wie der Abschnitt zum <link
linkend="language.types.string.parsing">Parsen von Variablen in Strings</link>.
</simpara>
</note>
</sect4>
</sect3>
</sect2>
<sect2 xml:id="language.types.array.casting">
<title>Konvertierung zu Array</title>
<para>
Für jeden der Typen <type>Integer</type>, <type>Float</type>,
<type>String</type>, <type>Boolean</type> und <type>Resource</type>
führt eine Konvertierung eines Wertes in ein <type>Array</type> zu einem
Array mit einem einzigen Wert mit dem Index Null und dem Wert des
Skalaren der konvertiert wurde. Anders ausgedrückt ist
<literal>(array)$scalarValue</literal> exakt identisch mit
<literal>array($scalarValue)</literal>.
</para>
<para>
Wenn ein <type>Object</type> in ein <type>Array</type> konvertiert wird, so
ist das Ergebnis ein <type>Array</type> dessen werte die Eigenschaften des
<type>Object</type> sind. Die Schlüssel sind die Namen der Eigenschaften
des Objektes mit einigen Ausnahmen: Eigenschaften mit Ganzzahl-Namen
sind nicht zugreifbar, privaten Variablen wird der Name der Klasse
vorangestellt und protected Variablen wird ein '*' dem Namen der Variablen
vorangestellt. Diese vorangestellten Werte haben Null-Bytes auf beiden Seiten.
Dies kann zu unerwartetem Verhalten führen:
</para>
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
class A {
private $A; // Dies wird zu '\0A\0A'
}
class B extends A {
private $A; // Dies wird zu '\0B\0A'
public $AA; // Dies wird zu 'AA'
}
var_dump((array) new B());
?>
]]>
</programlisting>
</informalexample>
<para>
Im obigen Beispiel scheint es zwei Schlüssel namens 'AA' zu geben, obwohl
einer davon eigentlich '\0A\0A' ist.
</para>
<para>
Die Konvertierung von &null; in ein <type>Array</type> führt zu einem
leeren <type>Array</type>.
</para>
</sect2>
<sect2 xml:id="language.types.array.comparing">
<title>Vergleiche</title>
<para>
Es ist möglich Arrays mit der Funktion <function>array_diff</function>
und mit
<link linkend="language.operators.array">Array-Operatoren</link>
zu vergleichen.
</para>
</sect2>
<sect2 xml:id="language.types.array.examples">
<title>Beispiele</title>
<para>
Der Array-Typ in PHP ist sehr vielseitig. Hier sind einige Beispiele:
</para>
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
// This:
$a = array( 'color' => 'red',
'taste' => 'sweet',
'shape' => 'round',
'name' => 'apple',
4 // Schlüssel wird 0 sein
);
$b = array('a', 'b', 'c');
// . . .ist komplett gleichbedeutend mit:
$a = array();
$a['color'] = 'red';
$a['taste'] = 'sweet';
$a['shape'] = 'round';
$a['name'] = 'apple';
$a[] = 4; // Schlüssel wird 0 sein
$b = array();
$b[] = 'a';
$b[] = 'b';
$b[] = 'c';
// Nachdem der obige Code ausgeführt wurde wird $a das Array
// array('color' => 'red', 'taste' => 'sweet', 'shape' => 'round',
// 'name' => 'apple', 0 => 4) sein und $b wird das Array
// array(0 => 'a', 1 => 'b', 2 => 'c') oder einfacher array('a', 'b', 'c')
// sein
?>
]]>
</programlisting>
</informalexample>
<example>
<title>Benutzung von array()</title>
<programlisting role="php">
<![CDATA[
<?php
// Array als Map von Eigenschaften
$map = array( 'version' => 4,
'OS' => 'Linux',
'lang' => 'english',
'short_tags' => true
);
// Streng numerische Schlüssel
$array = array( 7,
8,
0,
156,
-10
);
// das ist gleichbedeutend mit array(0 => 7, 1 => 8, ...)
$switching = array( 10, // Schlüssel = 0
5 => 6,
3 => 7,
'a' => 4,
11, // Schlüssel = 6 (Maximum der Integer-Schlüssel war 5)
'8' => 2, // Schlüssel = 8 (Integer!)
'02' => 77, // Schlüssel = '02'
0 => 12 // Der Wert 10 wird mit 12 überschrieben
);
// Leeres array
$empty = array();
?>
]]>
<!-- TODO example of
- overwriting keys
- using vars/functions as key/values
- warning about references
-->
</programlisting>
</example>
<example xml:id="language.types.array.examples.loop">
<title>Collection</title>
<programlisting role="php">
<![CDATA[
<?php
$colors = array('red', 'blue', 'green', 'yellow');
foreach ($colors as $color) {
echo "Do you like $color?\n";
}
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Do you like red?
Do you like blue?
Do you like green?
Do you like yellow?
]]>
</screen>
</example>
<para>
Die Veränderung der Werte eines <type>Array</type> ist seit PHP mit der
Übergabe als Referenz direkt möglich. Vorher war ein Workaround notwendig:
</para>
<example xml:id="language.types.array.examples.changeloop">
<title>Elemente in der Schleife verändern</title>
<programlisting role="php">
<![CDATA[
<?php
// PHP 5
foreach ($colors as &$color) {
$color = strtoupper($color);
}
unset($color); /* Sicherstellen, dass nachfolgende
Zugriffe auf $color nicht das letzte Element ändern */
// Workaround für ältere Versionen
foreach ($colors as $key => $color) {
$colors[$key] = strtoupper($color);
}
print_r($colors);
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Array
(
[0] => RED
[1] => BLUE
[2] => GREEN
[3] => YELLOW
)
]]>
</screen>
</example>
<para>
Dieses Beispiel erzeugt ein Array mit erstem Schlüsse 1
</para>
<example>
<title>1-basierte Indizes</title>
<programlisting role="php">
<![CDATA[
<?php
$firstquarter = array(1 => 'January', 'February', 'March');
print_r($firstquarter);
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Array
(
[1] => 'January'
[2] => 'February'
[3] => 'March'
)
]]>
</screen>
</example>
<example>
<title>Ein Array befüllen</title>
<programlisting role="php">
<![CDATA[
<?php
// Dies füllt ein Array mit allen Einträgen eines Verzeichnisses
$handle = opendir('.');
while (false !== ($file = readdir($handle))) {
$files[] = $file;
}
closedir($handle);
?>
]]>
</programlisting>
</example>
<para>
<type>Array</type>s sind sortiert. Die Reihenfolge kann durch verschiedene
Sortierfunktionen verändert werden. Siehe <link linkend="ref.array">
Array-Funktionen</link> für mehr Informationen. Die Funktion
<function>count</function> kann herangezogen werden, um die Anzahl
der Elemente eines <type>Array</type> zu ermitteln.
</para>
<example>
<title>Ein Array sortieren</title>
<programlisting role="php">
<![CDATA[
<?php
sort($files);
print_r($files);
?>
]]>
</programlisting>
</example>
<para>
Da die Werte eines <type>Array</type> beliebig sein können, können diese
auch andere <type>Array</type>s sein. Dies ermöglicht die Erzeugung von
rekursiven und mehrdimensionalen <type>Array</type>s.
</para>
<example>
<title>Rekursive und mehrdimensionale Arrays</title>
<programlisting role="php">
<![CDATA[
<?php
$fruits = array ( "fruits" => array ( "a" => "orange",
"b" => "banana",
"c" => "apple"
),
"numbers" => array ( 1,
2,
3,
4,
5,
6
),
"holes" => array ( "first",
5 => "second",
"third"
)
);
// Einige Beispiele um auf Werde in den obigen Beispielen zuzugreifen
echo $fruits["holes"][5]; // prints "second"
echo $fruits["fruits"]["a"]; // prints "orange"
unset($fruits["holes"][0]); // remove "first"
// Ein neues mehrdimensionales Array erzeugen
$juices["apple"]["green"] = "good";
?>
]]>
</programlisting>
</example>
<para>
Zuweisung von <type>Array</type>s zu Variablen involviert immer eine
Kopie der Werte. Verwenden Sie den <link linkend="language.operators">
Referenz-Operator</link> um eine Kopie einer Referenz auf ein
<type>Array</type> zu erzeugen.
</para>
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
$arr1 = array(2, 3);
$arr2 = $arr1;
$arr2[] = 4; // $arr2 ist geändert,
// $arr1 ist weiterhin array(2, 3)
$arr3 = &$arr1;
$arr3[] = 4; // nun sind $arr1 und $arr3 identisch
?>
]]>
</programlisting>
</informalexample>
</sect2>
</sect1>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->