2012-05-28 20 views
17

Kiedy robię json_encode wielowymiarową tablicę w PHP, zauważam inne wyjście, po prostu nazywając jedną z tablic, w przeciwieństwie do nie nazywania ich. Na przykład:JSON_ENCODE z wielowymiarowej tablicy dającej różne wyniki

$arrytest = array(array('a'=>1, 'b'=>2),array('c'=>3),array('d'=>4)); 
json_encode($arrytest) 

daje pojedyncza tablica stwardnienie json obiektów

[{"a":1,"b":2},{"c":3},{"d":4}]; 

natomiast po prostu przypisanie nazwy do środkowej tablicy

$arrytest = array(array('a'=>1, 'b'=>2),"secondarray"=>array('c'=>3),array('d'=>4)); 
json_encode($arrytest) 

tworzy pojedynczy obiekt json z wiele obiektów json wewnątrz

{"0":{"a":1,"b":2},"secondarray":{"c":3},"1":{"d":4}}; 

dlaczego 1st opcja nie zwraca te same reasults jako 2nd execpt z „1” zamiast „secondarray”

+0

http://json.org/ –

+3

Felix Kling, dlaczego usunąłeś mój tag kodujący json? Nie mówię, że nie powinieneś tego robić, ale raczej chcę się upewnić, że podążam za poprawną procedurą oznaczania, ponieważ kodowanie json jest w moim kodzie, chociaż byłoby to odpowiednie jako właściwy tag. – dangel

Odpowiedz

25

W JSON, tablice [] tylko co ma klawiszy numerycznych, podczas gdy obiekty {} mają właściwości ciągów . Włączenie klucza tablicy do twojego drugiego przykładu wymusza całą zewnętrzną strukturę jako obiekt z konieczności. Wewnętrzne obiekty obu przykładów są wykonane jako obiekty ze względu na włączenie kluczy strunowych a,b,c,d.

Jeśli użyjesz opcji JSON_FORCE_OBJECT w pierwszym przykładzie, powinieneś otrzymać podobną strukturę do drugiej, a zewnętrzna struktura będzie obiektem, a nie tablicą. Bez określenia, że ​​chcesz go jako obiekt, brak kluczy łańcuchowych w zewnętrznej tablicy powoduje, że PHP zakłada, że ​​ma być zakodowane jako równoważna struktura tablicowa w JSON.

$arrytest = array(array('a'=>1, 'b'=>2),array('c'=>3),array('d'=>4)); 

// Force the outer structure into an object rather than array 
echo json_encode($arrytest , JSON_FORCE_OBJECT); 

// {"0":{"a":1,"b":2},"1":{"c":3},"2":{"d":4}} 
+4

Więc dlaczego nazywają to JAVASCRIPT OBJECT NOTATION, jeśli nie ma to nic wspólnego z Javascriptem. – Brendan

+0

To ma sens, dzięki za wyjaśnienie, które moim zdaniem doprowadzi mnie w dobrym kierunku. – dangel

+1

@Brendan Dlaczego to nie ma nic wspólnego z JavaScript? – deceze

0

Tablice z ciągłymi kluczami numerycznymi są kodowane jako tablice JSON. Tak po prostu jest. Czemu? Ponieważ ma to sens.

Ponieważ klucze mogą być wyrażone niejawnie poprzez kodowanie macierzy, nie ma powodu, aby jawnie zakodować je jako klucze obiektów.

Zobacz wszystkie przykłady w json_encode documentation.

+0

Nie mówię, że nie powinny, dlatego zadałem to pytanie. – dangel

0

W pierwszej opcji dostępne są tylko indeksy liczbowe (0, 1 i 2). Mimo że nie są one jawnie zadeklarowane, php automatycznie je tworzy.

Przy drugiej opcji, deklarujesz jeden z indeksów jako ciąg znaków, co powoduje, że PHP wewnętrznie przekształca wszystkie indeksy na łańcuch.

Kiedy json zakodować pierwszą tablicą, to nie jest konieczne, aby pokazać liczb całkowitych w generowanym ciąg json bo każdy dekoder powinien być w stanie „odgadnąć”, które są 0, 1 i 2.

Ale w druga tablica, jest to konieczne, ponieważ dekoder musi znać wartość klucza w twojej tablicy.

To całkiem proste. Brak deklarowanych indeksów w tablicy? Oni są 0, 1, 2, 3 i tak dalej.

Powiązane problemy