json_encode sparse PHP array sebagai JSON array, bukan objek JSON

119

Saya memiliki array berikut di PHP:

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

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

Saya ingin JSON menyandikannya sebagai array JSON, menghasilkan string seperti berikut:

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

Tetapi ketika saya memanggil json_encodearray ini, saya mendapatkan yang berikut:

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

yang merupakan objek, bukan array.

Bagaimana saya bisa json_encodemengenkode array saya sebagai array?

Martijn Pieters
sumber

Jawaban:

194

Anda mengamati perilaku ini karena array Anda tidak berurutan - memiliki kunci 0dan 2, tetapi tidak memiliki 1kunci.

Memiliki indeks numerik saja tidak cukup. json_encodehanya akan menyandikan array PHP Anda sebagai array JSON jika array PHP Anda berurutan - yaitu, jika kuncinya adalah 0, 1, 2, 3, ...

Anda dapat mengindeks ulang array Anda secara berurutan menggunakan array_valuesfungsi tersebut untuk mendapatkan perilaku yang Anda inginkan. Misalnya, kode di bawah ini berfungsi dengan baik dalam kasus penggunaan Anda:

echo json_encode(array_values($input)).
Nguyen Van Vinh
sumber
4
tetapi bagaimana jika kunci 0,2itu penting? Saya dalam situasi yang sama di mana saya tidak dapat mengindeks ulang array.
shyammakwana.me
2
JSON tidak mendukung array asosiatif. rujuk: tools.ietf.org/html/rfc7159#section-5
Nguyen Van Vinh
74

Arraydi hanyaJSON array yang diindeks , jadi struktur yang Anda coba dapatkan bukanlah Json / Javascript yang valid.

Array Asosiasi PHP adalah objek di JSON, jadi kecuali Anda tidak memerlukan indeks, Anda tidak dapat melakukan konversi seperti itu.

Jika Anda ingin mendapatkan struktur seperti itu, Anda dapat melakukan:

$indexedOnly = array();

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

json_encode($indexedOnly);

Akan mengembalikan sesuatu seperti:

[
     [0, "name1", "n1"],
     [1, "name2", "n2"],
]
Boris Guéry
sumber
1
Terima kasih telah memberi saya petunjuk tentang array yang diindeks :) masalahnya adalah saya mengindeksnya sedemikian rupa sehingga id juga merupakan id dari array, bukan id sekuensial dan json_encode tidak mengambilnya sebagai array tetapi seperti pada objek sebagai gantinya karena array tidak berurutan diperbaiki sekarang terima kasih atas semua bantuan Anda guys :)
Tidak benar. Beberapa perpustakaan melakukan encode array asosiatif sebagai array dengan indeks sebagai salah satu properti elemen.
Gustavo
Saya tidak mengerti apa yang Anda maksud - array dalam jawaban Martin tidak diindeks, dan itu JSON yang valid.
Dan Akhirnya
@AndFinally, array dalam jawaban Martin adalah sebenarnya diindeks, secara implisit. Menghilangkan hasil indeks dalam larik terindeks yang dimulai dari nol.
Boris Guéry
Jawaban ini tidak cukup memberikan apa yang diinginkan OP pada saat mereka memposting pertanyaan (tidak mengherankan, karena apa yang diinginkan OP tidak mungkin), dan pengeditan mereka sejak saat itu membuat jawaban ini tampak sangat salah mengingat keadaan saat ini. pertanyaan. Anda tidak dapat menghapus jawaban ini, karena sudah diterima, tapi mungkin tandai sebagai moderator untuk menghapusnya untuk Anda? Karena ini memiliki lebih dari 5 suara positif, Anda akan mempertahankan perwakilan Anda.
Mark Amery
0

json_decode ($ jsondata, true);

true mengubah semua properti menjadi array (berurutan atau tidak)

Robert Sinclair
sumber
tidak terkait dengan pertanyaan yang diajukan oleh OP. OP secara khusus menanyakan masalah encoding yang ditemui menggunakanjson_encode
pg2286
bagaimana ini tidak berhubungan? ini menunjukkan contoh penggunaan json_encode sehingga mengubah data menjadi array yang dapat dibaca. Pertanyaan OP adalah "Bagaimana saya bisa mendapatkan json_encode untuk menyandikan array saya sebagai sebuah array" kode saya melakukan hal itu .. Saya gussing itu kata "Encode" yang menyebabkan Anda greef? Dengan 'encode' dia berarti 'berubah menjadi'. Itu bukan alasan untuk tidak memilih.
Robert Sinclair
oh saya mengerti maksud Anda sekarang, bahwa Anda akan merekomendasikan sesuatu seperti ini pada $serialized = json_encode($nonContiguousArray); $unserialize = json_decode($serialized, true); akhirnya finallySerializedInArrayFormat = json_encode($unserialize);jika ini yang Anda inginkan, Anda benar, tetapi sepertinya solusi yang sedikit bertele-tele.
hal2286
-1

Coba ini,

<?php
$arr1=array('result1'=>'abcd','result2'=>'efg'); 
$arr2=array('result1'=>'hijk','result2'=>'lmn'); 
$arr3=array($arr1,$arr2); 
print (json_encode($arr3)); 
?>
Y0Gi
sumber
ini tidak menyelesaikan masalah apa yang OP coba tanyakan.
hal2286