json_encode PHP dizisini JSON dizisi olarak, JSON nesnesi olarak değil


119

PHP'de aşağıdaki diziye sahibim:

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

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

JSON bunu bir JSON dizisi olarak kodlamak ve aşağıdaki gibi bir dize üretmek istiyorum:

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

Ama json_encodebu diziyi çağırdığımda şunu alıyorum:

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

dizi yerine bir nesnedir.

json_encodeBunun yerine dizimi bir dizi olarak nasıl kodlayabilirim?

Yanıtlar:


194

O tuşları bulunuyor - Kendi dizi sıralı olmadığı için bu davranışlarla 0ve 2fakat yok 1bir anahtar olarak.

Sadece sayısal dizinlere sahip olmak yeterli değildir. json_encodePHP diziniz sıralıysa, yani anahtarları 0, 1, 2, 3, ... ise PHP dizinizi yalnızca JSON dizisi olarak kodlayacaktır.

İstediğiniz array_valuesdavranışı elde etmek için işlevi kullanarak dizinizi sırayla yeniden dizine ekleyebilirsiniz . Örneğin, aşağıdaki kod sizin kullanım durumunuzda başarıyla çalışır:

echo json_encode(array_values($input)).

4
ama ya anahtarlar 0,2önemliyse? Diziyi yeniden dizinleyemediğim aynı durumdayım.
shyammakwana.me

2
JSON, ilişkilendirilebilir diziyi desteklemez. bakın: tools.ietf.org/html/rfc7159#section-5
Nguyen Van Vinh

74

Arrayin yalnızcaJSON dizine alınmış dizidir , bu nedenle almaya çalıştığınız yapı geçerli Json / Javascript değildir.

PHP Associatives dizisi JSON'daki nesnelerdir, bu nedenle dizine ihtiyacınız olmadığı sürece bu tür dönüşümleri yapamazsınız.

Böyle bir yapı elde etmek istiyorsanız, şunları yapabilirsiniz:

$indexedOnly = array();

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

json_encode($indexedOnly);

Aşağıdaki gibi bir şey döndürür:

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

1
Bana indekslenmiş dizi ipucunu verdiğiniz için teşekkürler :) problem, id de sıralı bir id yerine dizinin id'si olacak ve json_encode onu bir dizi olarak almadı, ancak olduğu gibi dizine aldım. bunun yerine nesne sıralı olmadığı için, tüm yardımlarınız için şimdi düzeltildi arkadaşlar :)

Doğru değil. Bazı kitaplıklar, ilişkilendirilebilir dizileri, öğe özelliklerinden biri olarak indeksi olan diziler olarak kodlar.
Gustavo

Ne demek istediğini anlamıyorum - Martin'in cevabındaki dizi indekslenmemiş ve bu geçerli JSON.
Ve Sonunda

@AndFinally, Martin'in yanıtında dizi olduğu aslında örtük, endekslendi. Dizinin çıkarılması, sıfırdan başlayan dizine alınmış bir dizi ile sonuçlanır.
Boris Guéry

Bu cevap, soruyu yayınladıkları sırada OP'nin ne istediğini tam olarak sağlamadı (şaşırtıcı olmayan bir şekilde, OP'nin istediği şey imkansızdı) ve o zamandan beri yaptıkları düzenlemeler, bu yanıtı, mevcut durumu göz önüne alındığında, görünüşte çılgınca yanlış bıraktı. soru. Kabul edildiği için bu yanıtı silemezsiniz, ancak bir moderatörün sizin için silmesini işaretleyebilirsiniz. 5'ten fazla olumlu oy aldığından, temsilcinizi koruyacaksınız.
Mark Amery

0

json_decode ($ jsondata, doğru);

true tüm özellikleri diziye dönüştürür (sıralı veya değil)


OP tarafından sorulan soru ile ilgili değildir. OPjson_encode
pg2286

bu nasıl ilişkili değil? bu json_encode kullanma örneğini gösterir, böylece verileri okunabilir bir diziye dönüştürür. OP'nin sorusu, "Dizimi bir dizi olarak kodlamak için json_encode'u nasıl elde edebilirim?" Benim kod parçam tam da bunu yapıyor .. Size greef neden olan "Kodlama" kelimesidir? 'Kodlamak' ile 'dönüşüyor' anlamına geliyor. Bu, olumsuz oy kullanmak için bir neden değil.
Robert Sinclair

oh şimdi anlıyorum, eğer $serialized = json_encode($nonContiguousArray); $unserialize = json_decode($serialized, true); niyetin finallySerializedInArrayFormat = json_encode($unserialize);buysa haklısın, ama biraz soluksuz bir çözüm gibi göründüyse sonunda böyle bir şey tavsiye edersin.
pg2286

-1

Bunu dene,

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

bu, OP'nin sormaya çalıştığı sorunu çözmez.
pg2286
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.