Seite 1 von 1

json_decode (Userreminder, Extension Manager Plus und andere)

Verfasst: 06.01.2025 21:25
von IMC
edit LukeWCS: abgetrennt von viewtopic.php?t=244082
LukeWCS hat geschrieben: 05.01.2025 20:10 Wir speichern z.B. beide via JSON
Ich musste mich gerade zwangsweise etwas näher mit JSON beschäftigen, da ich ein Problem mit Umlauten hatte. (Jetzt gelöst. :) )

Deshalb habe ich mir bei euch mal angeschaut wie ihr mit JSON kodierten Strings umgeht. Dabei ist mir aufgefallen, dass ihr bei json_decode() den zweiten Parameter nicht immer auf true setzt, um ein PHP-Array zu erzeugen. Der Rückgabewert von json_decode() wird jedoch wie ein Array behandelt. Ohne den Parameter true wird ein Objekt zurückgegeben.

Das dies ohne Probleme geht weis ich, da ich vorher den Parameter auch nicht nutzte. Jetzt nutze ich ihn um eventuellen späteren Problemen vorzubeugen.

Re: [3.2][3.3][CDB] Userreminder

Verfasst: 06.01.2025 22:14
von Mike-on-Tour
Hallo Thorsten,
gehört jetzt nicht so zum Thema "Userreminder", aber gem. PHP Dokumentation legt der zweite Parameter fest, ob du ein assoziatives oder ein nicht-assoziatives Array erzeugst. Die Verwendung hängt also davon ab, was vorher mit json_encode() umgewandelt wurde.

Re: [3.2][3.3][CDB] Userreminder

Verfasst: 06.01.2025 22:17
von LukeWCS
nAbend Thorsten
IMC hat geschrieben: 06.01.2025 21:25 Dabei ist mir aufgefallen, dass ihr bei json_decode() den zweiten Parameter nicht immer auf true setzt, um ein PHP-Array zu erzeugen.
Jupp da muss man differenzieren. Hier gehts um ein einfaches eindimensionales Array mit numerischem Index und numerischen Werten. Das wird, egal ob true oder false als zweiter Parameter, immer als Array zurückgegeben, darum kann der zweite Parameter entfallen. Ganz anders sieht es aus, wenn wir ein Mapping haben, also ein assoziatives Array. Darum setze ich den zweiten Parameter bei EMP immer auf true, weil das nur mit assoziativen Arrays hantiert und ich da kein Objekt brauchen kann. Bei FAR lass ich den Parameter weg, weil ich da nur mit eindimensionalen Arrays mit numerischem Index hantiere und dieser Typ sowieso als Array zurückgegeben wird. Vermutlich weil er nicht zu einem Objekt konvertiert werden kann.

edit: Mike war schneller.
edit2: Hab das mal von UR abgetrennt, da allgemein.

Re: json_decode (Userreminder, Extension Manager Plus und andere)

Verfasst: 06.01.2025 23:35
von IMC
Ich habe noch mal getestet.

Code: Alles auswählen

$json0 = json_encode(["eins"=>"eins","zwei"=>"zwei","drei"=>"drei"]);
$json1 = json_encode(["eins","zwei","drei"]);
var_dump(json_decode($json0));
var_dump(json_decode($json0, true));
var_dump(json_decode($json1));
var_dump(json_decode($json1, true));
Die Ausgabe:

Code: Alles auswählen

object(stdClass)#1 (3) {
  ["eins"]=>
  string(4) "eins"
  ["zwei"]=>
  string(4) "zwei"
  ["drei"]=>
  string(4) "drei"
}
array(3) {
  ["eins"]=>
  string(4) "eins"
  ["zwei"]=>
  string(4) "zwei"
  ["drei"]=>
  string(4) "drei"
}
array(3) {
  [0]=>
  string(4) "eins"
  [1]=>
  string(4) "zwei"
  [2]=>
  string(4) "drei"
}
array(3) {
  [0]=>
  string(4) "eins"
  [1]=>
  string(4) "zwei"
  [2]=>
  string(4) "drei"
}
Es ist so wie ihr es beschrieben habt. Wenn man das true bei einfachen Arrays setzt hat es keine negativen Auswirkungen.

Re: json_decode (Userreminder, Extension Manager Plus und andere)

Verfasst: 07.01.2025 23:46
von LukeWCS
nAbend Thorsten, wie üblich zur Nachtschicht. :D
IMC hat geschrieben: 06.01.2025 23:35 Die Ausgabe:
...
Es ist so wie ihr es beschrieben habt.
Jupp. Aber aufgrund deiner Überlegung habe ich mir die Doku der Funktion nochmal genauer angeschaut. Mein damaliger Entschluss bei einfachen Arrays den zweiten Parameter nicht zu setzen, war der, das ich bei einem normalen Array ja kein assoziatives Array brauche. Jetzt kommt das Aber: Bei PHP gibt es eigentlich keine "normalen" Arrays, sondern jeder Array Typ wird immer als Mapping abgebildet. Das sieht man auch prima an deinen Dumps bezüglich dem normalen Array, denn auch das ist ein Mapping, nur eben eines mit einem rein numerischen Schlüssel. Und soweit ich die Defaults der Funktion verstanden habe, liefert die Funktion immer ein Objekt zurück, wenn man nicht explizit etwas anderes definiert.
Wenn man das true bei einfachen Arrays setzt hat es keine negativen Auswirkungen.
Genau. Das heisst unterm Strich; korrekter/konsequenter wäre eigentlich die konstante/explizite Verwendung des zweiten Parameters mit true, wenn man kein Objekt benötigt, denn auch ein normales JSON kodiertes Array wird immer als Mapping (assoziatives Array) dekodiert.