json_encode rzadka tablica PHP jako tablica JSON, a nie obiekt JSON


119

Mam następującą tablicę w PHP:

Array
(
    [0] => Array
        (
            [id] => 0
            [name] => name1
            [short_name] => n1
        )

    [2] => Array
        (
            [id] => 2
            [name] => name2
            [short_name] => n2
        )
)

Chcę zakodować JSON jako tablicę JSON, tworząc ciąg podobny do następującego:

[  
    {  
        "id":0,
        "name":"name1",
        "short_name":"n1"
    },
    {  
        "id":2,
        "name":"name2",
        "short_name":"n2"
    }
]

Ale kiedy wywołuję json_encodetę tablicę, otrzymuję następujące informacje:

{  
    "0":{  
        "id":0,
        "name":"name1",
        "short_name":"n1"
    },
    "2":{  
        "id":2,
        "name":"name2",
        "short_name":"n2"
    }
}

który jest obiektem zamiast tablicą.

Jak mogę json_encodezamiast tego zakodować moją tablicę jako tablicę?

Odpowiedzi:


194

Obserwujesz to zachowanie, ponieważ twoja tablica nie jest sekwencyjna - ma klucze 0i 2, ale nie ma 1klucza.

Samo posiadanie indeksów numerycznych nie wystarczy. json_encodezakoduje twoją tablicę PHP jako tablicę JSON tylko wtedy, gdy twoja tablica PHP jest sekwencyjna - to znaczy, jeśli jej klucze to 0, 1, 2, 3, ...

Możesz ponownie zindeksować tablicę sekwencyjnie, korzystając z array_valuesfunkcji, aby uzyskać pożądane zachowanie. Na przykład poniższy kod działa pomyślnie w Twoim przypadku użycia:

echo json_encode(array_values($input)).

4
ale co jeśli klucze 0,2są ważne? Jestem w tej samej sytuacji, w której nie mogę ponownie zindeksować tablicy.
shyammakwana.me

2
JSON nie obsługuje tablic asocjacyjnych. refer: tools.ietf.org/html/rfc7159#section-5
Nguyen Van Vinh,

74

Arrayw JSONtylko tablicami indeksowanymi , więc struktura, którą próbujesz uzyskać, nie jest poprawna w języku Json / Javascript.

Tablica asocjacyjna PHP to obiekty w formacie JSON, więc jeśli nie potrzebujesz indeksu, nie możesz wykonywać takich konwersji.

Jeśli chcesz uzyskać taką strukturę, możesz:

$indexedOnly = array();

foreach ($associative as $row) {
    $indexedOnly[] = array_values($row);
}

json_encode($indexedOnly);

Zwróci coś takiego:

[
     [0, "name1", "n1"],
     [1, "name2", "n2"],
]

1
Dzięki za wskazanie tablicy indeksowanej :) problem polegał na tym, że zindeksowałem ją w taki sposób, że id był również identyfikatorem tablicy zamiast identyfikatora sekwencyjnego, a json_encode nie odebrał jej jako tablicy, ale jak w obiekt zamiast tego, ponieważ tablica nie była sekwencyjna, została naprawiona teraz dzięki za całą twoją pomoc :)

Nie prawda. Niektóre biblioteki kodują tablice asocjacyjne jako tablice z indeksem jako jedną z właściwości elementu.
Gustavo

Nie rozumiem, co masz na myśli - tablica w odpowiedzi Martina nie jest indeksowana, a to jest prawidłowy format JSON.
I wreszcie

@ I wreszcie, tablica w odpowiedzi Martina jest faktycznie indeksowana, niejawnie. Pominięcie indeksu skutkuje tablicą indeksowaną zaczynającą się od zera.
Boris Guéry

Ta odpowiedź nie do końca zapewniała to, czego chciał PO w momencie, gdy opublikował pytanie (co nie jest zaskakujące, ponieważ to, czego chciał PO, było niemożliwe), a ich zmiany od tamtego czasu pozostawiły tę odpowiedź pozornie szalenie błędną, biorąc pod uwagę obecny stan pytanie. Nie możesz usunąć tej odpowiedzi, ponieważ została zaakceptowana, ale może zgłoś moderatorowi możliwość usunięcia jej za Ciebie? Ponieważ ma ponad 5 głosów za, zachowasz reputację.
Mark Amery

0

json_decode ($ jsondata, prawda);

true zamienia wszystkie właściwości na tablice (sekwencyjne lub nie)


nie dotyczy pytania zadanego przez OP. OP konkretnie zapytał o problem z kodowaniem napotkany przy użyciujson_encode
pg2286

dlaczego to nie jest powiązane? pokazuje przykład użycia json_encode, więc przekształca dane w czytelną tablicę. Pytanie OP brzmi: „Jak mogę uzyskać kod json_encode, aby zakodować moją tablicę jako tablicę”, mój fragment kodu właśnie to robi… Rozumiem, że to słowo „Koduj” sprawia, że ​​jesteś zadowolony? Przez „kodowanie” ma na myśli „zamienia się w”. To nie jest powód do przegłosowania.
Robert Sinclair

och, teraz rozumiem twój punkt widzenia, że ​​w $serialized = json_encode($nonContiguousArray); $unserialize = json_decode($serialized, true); końcu poleciłbyś coś takiego, finallySerializedInArrayFormat = json_encode($unserialize);jeśli to jest to, co zamierzasz, masz rację, ale wydawało się, że jest to trochę zdyszane rozwiązanie.
pg2286

-1

Spróbuj tego,

<?php
$arr1=array('result1'=>'abcd','result2'=>'efg'); 
$arr2=array('result1'=>'hijk','result2'=>'lmn'); 
$arr3=array($arr1,$arr2); 
print (json_encode($arr3)); 
?>

to nie rozwiązuje problemu, o który próbuje zapytać PO.
pg2286
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.