Auf den ersten Blick liefert die PHP-Funktion json_encode ein unerwartetes Ergebnis, wenn man ein Array mit numerischen Indizes umwandelt.
#1 fortlaufenden, numerische Indizes 0, 1 und 2
1 | $a = array(5, 6, 7); |
echo json_encode($a);
#1 Ausgabe: Array sieht wie erwartet aus
1 | [5,6,7] |
#2 Index beginnt bei 2
1 | $b = array(2 => 'a', 'b', 'c'); |
echo json_encode($b);
#2 Ausgabe ist kein Array, sondern ein Objekt
1 | {"2":"a","3":"b","4":"c"} |
#3 Index beginnt bei 0 und macht dann einen Sprung auf 20
1 | $c = array(5, 20 => 6); |
echo json_encode($c);
#3 Ausgabe ist kein Array, sondern ein Objekt
1 | {"0":5,"20":6} |
Unerwartet aber es macht natürlich Sinn. Javascript kennt keine associativen Arrays, sondern nur fortlaufend nummerierte.
“Associative Arrays” werden in Javascript als Objekte abgebildet, da ist ist es von json_encode natürlich richtig, in diesem Fall so zu verfahren.


Falls auch numerische Arrays als Objekt ausgegeben werden sollen:
$a = array(5, 6, 7);
json_enode($a,JSON_FORCE_OBJECT);
Guter Hinweis! Es lohnt sich immer periodisch die optionalen Parameter der PHP-Funktionen nachzuschauen. Oft schieben die bei Minor-Updates echte Schätze mit rein. Letztens erst wieder bei file_(get|put)_content entdeckt.