2012-09-24 18 views
5

Jeśli mogę to zrobić:różne wyniki dla json_encode() PHP

$new_arr = array(
0 => 'keyboard', 
1 => 'mouse', 
2 => 'computer' 
); 

print_r(json_encode($new_arr)); 

wyjściowa:

[ "klawiatura", "mysz", "komputer"]

Ale powiedz, że pobieram wszystkie wiersze tabeli "produktu" z mojej bazy danych i robię to:

$product_with_id_map = array(); 
foreach($query as $result) { 
$product_with_id_map[$result->id] = $result->name; 
} 
print_r(json_encode($product_with_id_map)); 

wyjściowa:

{ "0": "klawiatura", "1": "mysz", "2": "Komputer"}

naprawdę trzeba zachować klucz od array kiedy i json_encode również możesz mi powiedzieć, jak osiągnąć drugie wyjście w pierwszym przykładzie?

+1

Po prostu mam pytanie w prawo: Druga forma wyjściowa jest pożądana, prawda? – vzwick

+0

tak dokładnie chcę zachować klucze tablicy w moim json_encode –

+2

* "Naprawdę muszę zachować klucz tablicy kiedy json_encode ..." * No cóż, technicznie masz. Klucze są takie same w obu przykładach. Ale pierwszy to tablica, a drugi to tylko obiekt z kluczami właściwości składającymi się wyłącznie z cyfr. Jeśli dekodowanie tego JSON-a jest JavaScript, to jest to bardzo subtelna różnica (ponieważ klucze tablicy są łańcuchami w JavaScript - [tak, naprawdę] (http://blog.niftysnippets.org/2011/01/myth-of-arrays. html)). Inne języki mogą się różnić. –

Odpowiedz

6

Prześlij tablicę do obiektu.

$new_arr = array(
    0 => 'keyboard', 
    1 => 'mouse', 
    2 => 'computer' 
); 

print_r(json_encode((object)$new_arr)); 
// output: {"0":"keyboard","1":"mouse","2":"computer"} 

addtion: Jeśli używasz tego rezultat w JavaScript, proponuję użyć tablicy, tablica jest również obiekt w javascript, poza tym zapewnić więcej metod i length własności do ciebie.

+0

tak doskonały, który działa, czy możesz mi powiedzieć, dlaczego dostałem różne wyniki? –

+0

@ user1537158 - ponieważ tablice działają inaczej niż obiekty w JSON. – vzwick

+0

@xazz: nie musisz nawet konwertować tablicy na obiekt. Wyjście json_encode może zawierać klucze, ponieważ używa on przyrostowej sekwencji liczb do skonstruowania tablicy, wyjście json_encode pomija klucze. To naprawdę nie ma wpływu, gdy konwertuje ten łańcuch json_encoded na tablicę wstecz, klawisze powrócą w sekwencji przyrostowej.Spróbuj zmienić klucz '1' na' 4' i zobaczyć wyjście json_encode –

8

użyć opcji (since PHP 5.3):

print_r(json_encode($product_with_id_map, JSON_FORCE_OBJECT)); 
2

Dzieje się tak dlatego, że indeksy, które są zwracane z bazy danych wracają jako ciągi i tak są zakodowane w formacie JSON też. Gdzie, gdy tworzysz tablicę, ustawiasz je jako liczby całkowite i dlatego są ignorowane.

Można też spróbować

$new_arr = array(
'0' => 'keyboard', 
'1' => 'mouse', 
'2' => 'computer' 
); 

print_r(json_encode($new_arr)); 

czy można TRUN tablicę do obiektu, który pozwoli na zachowanie indeksów.

print_r(json_encode((object)$new_arr)); 
+0

Twój pierwszy fragment kodu nie zadziała, nie ma znaczenia, chyba że rzucisz tablicę na obiekt. – xdazz

Powiązane problemy