(PHP-Script) Wieso funktioniert das einmal und einmal nicht?

2 Antworten

Von Experte Mirko Marek bestätigt

Gleich vorweg: Bitte zeichne Quelltext hier auch als Quelltext aus. Es gibt dafür eine extra Formatierung und die macht alles deutlich besser lesbar.

Zu deinem Problem: Punkte und Leerzeichen sind als Key in Formularen nicht erlaubt und werden in einen Unterstrich umgewandelt. Dein Key im PHP-Formular ist daher 'Self_P1'. Ein vardump() vom $_POST hätte dir das zeigen sollen.

Generell würde ich dir raten, andere Keys zu verwenden. Ich würde auch alles klein schreiben und als Trenner gleich den Unterstrich nutzen.

Außerdem kannst du dir die vielen isset() sparen und besser den Null Coalescing Operator nutzen:

'self_p1' => $_POST['self_p1'] ?? null;

Damit wird es kürzer und besser lesbar.

Woher ich das weiß:Berufserfahrung – Entwickle seit > 20 Jahren Anwendungen mit PHP.

Dein JSON wird in ein PHP array umgewandelt. Das sollte ein vardump auch anzeigen.

Ein Array in PHP ist aber einfach ein Key Value Store Datentyp. Als Value kann auch wieder ein weiteres Array drin sein.

Jetzt versuchst du im Haupt Array zuerst den Wert Self abzurufen und dann willst du auf z.B. P1 zugreifen. Den Wunsch für den sogenannten Nested Zugriff hast du mit dem Punkt ausdrücken wollen. PHP erkennt aber schlichtweg den Key "Self.P1" und kein Nested Zugriff.

So ähnlich funktioniert es auch in den meisten Programmiersprachen, wenn man das JSON in die dort jeweilige Map Datenstruktur übertragen hat.

Zum Lösen müsstest du erstmal das Self Datenobjekt abrufen bzw. ein neues Array davon erstellen. Auf dem neuen Array kannst du dann per z.B. P1 auf dein Wert zugreifen.

Du siehst ja auch im JSON die Objekt Struktur (mit {} dargestellt). Jedes JSON Objekt (oder auch JSON Array per []) entspricht in PHP dem array Datentyp. Verschachtelte Objekte werden in PHP genauso verschachtelt dargestellt.

Bei deinem ersten Beispiel hast du mit folgendem ein neues verschachteltes Array erzeugt:

       "P5" => [
           "SP1" => $_POST['P1'],
       ],

Daher funktioniert es dort auch.