js, associative arrays mit integriertem array erzeugen
bearbeitet vonLieber henry,
nur noch als Nachtrag, da Array-Daten in einem Formular zu erheben nicht trivial ist.
> Die Felder (Input) haben auch jeweils eine eindeutige "id" ("varname_0", "bgcolor_0", ""varname_1", "bgcolor_1" usw.)
PHP bietet für solche Fälle an, dass man als POST-Schlüssel einen Namen mit eckigen Klammern verwendet:
~~~ html
<input name="zutaten[]" type="checkbox" value="Tomaten">
~~~
Das ist für die Verarbeitung mit PHP durchaus praktisch. Da PHP als Schlüssel `zutaten[]` sieht, wird es ein Array namens `$_POST['zutaten']`{:.language-php} anlegen und jeden so übertragenen POST-Wert als Array-Element hinzufügen:
~~~ php
$_POST = [
'zutaten' => ['Tomaten']
];
~~~
Manchmal will man das aber explizit nicht. Vor allem dann nicht, wenn man mehrere Schlüssel-Wert-Paare für einen Datensatz haben will:
~~~ html
<li>
<input id="zutat-1" name="zutat-1" type="checkbox" value="Tomate">
<label for="zutat-1">Tomate</label>
<label for="menge-1">Gewicht in Gramm</label>
<input id="menge-1" name="menge-1" type="number" min=1" max="200" value="1">
</li>
~~~
Hier hat man in den POST-Daten garantiert das Schlüssel-Wert-Paar `menge-1=1`, aber vielleicht keinen Schlüssel `zutat-1`, weil der Benutzer die Checkbox dafür nicht angehakt hat. Das soll ja bedeuten, dass die Mengenangabe für die Tomaten ohne Bedeutung ist, weil die Zutat überhaupt nicht verwendet werden soll. Stellen wir uns vor, das Formular käme mit diesen Werten an:
~~~ php
$_POST = [
'menge-1' => 1,
'menge-2' => 40,
'menge-3' => 1,
'menge-4' => 1,
'menge-5' => 7,
'zutat-2' => 'Schinken'
'zutat-5' => 'Salami'
];
~~~
Hätte man hier die für PHP spezielle Array-Schreibweisen verwendet, wäre das Ergebnis dieses hier:
~~~ php
$_POST['menge'] = [1, 40, 1, 1, 7];
$_POST['zutaten'] = ['Schinken', 'Salami'];
~~~
Hier hilft das Sammelarray für die Mengen überhaupt nicht, weil nicht mehr klar ist, welche Menge nun für den Schinken gilt und welche für die Salami.
Will man nun die nummerierten Schlüssel in einer Schleife auslesen, verwendet man am besten ein reguläres Suchmuster, welches sich für das Ende des jeweiligen Schlüssels interessiert, indem es das Minuszeichen und die folgenden Ziffern haben möchte:
~~~ php
$zutaten = [];
foreach ($_POST as $key => $value) {
// $key endet auf "-123"? $found[1] enthält dann "123"
if (preg_match('~-(\d+)$~', $key, $found)) {
$nummer = $found[1];
$typ = preg_replace('~-\d+$~', '', $key); // entferne -123 am Ende
if (!array_key_exists($nummer, $zutaten)) {
$zutaten[$nummer] = [];
}
$zutaten[$nummer][$typ] = $value;
}
}
~~~
Jetzt hat man die POST-Werte in einem Array, welches alle zu einer Zutat gehörenden Daten als Unter-Array enthält. Für obiges Beispiel sähe das Ergebnis so aus:
~~~ php
$zutaten = [
1 => ['menge' => 1],
2 => ['menge' => 40, 'zutat' => 'Schinken'],
3 => ['menge' => 1],
4 => ['menge' => 1],
5 => ['menge' => 5, 'zutat' => 'Salami']
];
~~~
Somit kann man nun die empfangenen POST-Daten danach auswerten, in welchem Datensatz (Unterarray von `$zutaten`) es überhaupt einen Wert für `zutat` gibt, um den Datensatz nur dann zu akzeptieren und zu verarbeiten.
Liebe Grüße
Felix Riesterer
js, associative arrays mit integriertem array erzeugen
bearbeitet vonLieber henry,
nur noch als Nachtrag, da Array-Daten in einem Formular zu erheben nicht trivial ist.
> Die Felder (Input) haben auch jeweils eine eindeutige "id" ("varname_0", "bgcolor_0", ""varname_1", "bgcolor_1" usw.)
PHP bietet für solche Fälle an, dass man als POST-Schlüssel einen Namen mit eckigen Klammern verwendet:
~~~ html
<input name="zutaten[]" type="checkbox" value="Tomaten">
~~~
Das ist für die Verarbeitung mit PHP durchaus praktisch. Da PHP als Schlüssel `zutaten[]` sieht, wird es ein Array namens `$_POST['zutaten']`{:.language-php} anlegen und jeden so übertragenen POST-Wert als Array-Element hinzufügen:
~~~ php
$_POST = [
'zutaten' => ['Tomaten']
];
~~~
Manchmal will man das aber explizit nicht. Vor allem dann nicht, wenn man mehrere Schlüssel-Wert-Paare für einen Datensatz haben will:
~~~ html
<li>
<input id="zutat-1" name="zutat-1" type="checkbox" value="Tomate">
<label for="zutat-1">Tomate</label>
<label for="menge-1">Gewicht in Gramm</label>
<input id="menge-1" name="menge-1" type="number" min=1" max="200" value="1">
</li>
~~~
Hier hat man in den POST-Daten garantiert das Schlüssel-Wert-Paar `menge-1=1`, aber vielleicht keinen Schlüssel `zutat-1`, weil der Benutzer die Checkbox dafür nicht angehakt hat. Das soll ja bedeuten, dass die Mengenangabe für die Tomaten ohne Bedeutung ist, weil die Zutat überhaupt nicht verwendet werden soll. Stellen wir uns vor, das Formular käme mit diesen Werten an:
~~~ php
$_POST = [
'menge-1' => 1,
'menge-2' => 40,
'menge-3' => 1,
'menge-4' => 1,
'menge-5' => 7,
'zutat-2' => 'Schinken'
'zutat-5' => 'Salami'
];
~~~
Hätte man hier die für PHP spezielle Array-Schreibweisen verwendet, wäre das Ergebnis dieses hier:
~~~ php
$_POST['menge'] = [1, 40, 1, 1, 7];
$_POST['zutaten'] = ['Schinken', 'Salami'];
~~~
Hier hilft das Sammelarray für die Mengen überhaupt nicht, weil nicht mehr klar ist, welche Menge nun für den Schinken gilt und welche für die Salami.
Will man nun die nummerierten Schlüssel in einer Schleife auslesen, verwendet man am besten ein reguläres Suchmuster, welches sich für das Ende des jeweiligen Schlüssels interessiert, indem es das Minuszeichen und die folgenden Ziffern haben möchte:
~~~ php
$zutaten = [];
foreach ($_POST as $key => $value) {
// $key endet auf "-123"? $found[1] enthält dann "123"
if (preg_match('~-(\d+)$~', $key, $found)) {
$nummer = $found[1];
$typ = preg_replace('~-\d+$~', '', $key); // entferne -123 am Ende
if (!array_key_exists($nummer, $zutaten)) {
$zutaten[$nummer] = [];
}
$zutaten[$nummer][$typ] = $value;
}
}
~~~
Jetzt hat man die POST-Werte in einem Array, welches alle zu einer Zutat gehörenden Daten als Unter-Array enthält. Für obiges Beispiel sähe das Ergebnis so aus:
~~~ php
$zutaten = [
1 => ['menge' => 1],
2 => ['menge' => 40, 'zutat' => 'Schinken],
3 => ['menge' => 1],
4 => ['menge' => 1],
5 => ['menge' => 5, 'zutat' => 'Salami']
];
~~~
Somit kann man nun die empfangenen POST-Daten danach auswerten, in welchem Datensatz (Unterarray von `$zutaten`) es überhaupt einen Wert für `zutat` gibt, um den Datensatz nur dann zu akzeptieren und zu verarbeiten.
Liebe Grüße
Felix Riesterer