JSON nesne dönüşüm soru

5 Cevap php

Ben itiraz JSON dönüştürme ve nesneden diziye duyuyorum. Beklediğim, sen bana açıklayabilir değil mi?

$json = '{"0" : "a"}';
$obj = json_decode($json);
$a = (array) $obj;
print_r($a);
echo("a0:".$a["0"]."<br>");

$b = array("0" => "b");
print_r($b);
echo("b0:".$b["0"]."<br>");

Burada çıktı:

Array ( [0] => a ) a0:
Array ( [0] => b ) b0:b

Bir ilk satırın sonunda: Ben a0 umuyordum.

Edit: cevapları okuduktan sonra daha net davranışı yapar, kodu genişletilmiş:

//extended example
$json = '{"0" : "a"}';
$obj = json_decode($json);
$a = (array) $obj;
var_export($a);
echo("a0:".$a["0"]."<br>"); //this line does not work, see the answers
echo $obj->{"0"}."<br>";  //works!

$json = '{"x" : "b"}';
$obj = json_decode($json);
$b = (array) $obj;
var_export($b);
echo("bx:".$b["x"]."<br>");

$c = array("1" => "c");
var_export($c);
echo("c1:".$c["1"]."<br>");

$d = array("0" => "d");
var_export($d);
echo("d0:".$d["0"]."<br>");

Genişletilmiş Örnek Çıktı:

array ( '0' => 'a', )a0:
a
array ( 'x' => 'b', )bx:b
array ( 1 => 'c', )c1:c
array ( 0 => 'd', )d0:d 

5 Cevap

this older question daha bilgi var. Kısa versiyonu properties PHP nesneler / sınıfları aynı naming convention as variables takip olmasıdır. Sayısal bir özellik PHP nesne üzerinde geçersiz olduğunu, yani bir sayısal anahtarı olan başka bir dilde (json / javascript) bir nesne seri hale ne olması gerektiğini konusunda da net bir kural yoktur. Bu yukarıda ne olması gerektiğini size apaçık görünüyor olsa da, farklı bir önyargı ile birisi olarak mükemmel geçerli ve tercih edilen bu durumda PHP'nin davranışını görür.

Yani, bir hata naziksiniz, ama net bir cevap ile spec daha tanımlanmamış bir alan, yani davranış beğeninize karşılamak için değiştirmek için bekliyoruz yoktur ve bu değişiklik yaparsa, bu değişiklik kalıcı olmasını beklemeyin .

Yorumlardaki bazı sorunları gidermek için, bu düşünün

header('Content-Type: text/plain');
$json = '{"0" : "a"}';
$obj = json_decode($json);
$a = (array) $obj;
var_dump($a);
var_dump(array(0=>'a'));
var_dump(array('0'=>'a'));

Bunun gibi o irade çıktı üretir

array(1) {
  ["0"]=>
  string(1) "a"
}
array(1) {
  [0]=>
  string(1) "a"
}
array(1) {
  [0]=>
  string(1) "a"
}

Tek bir dize anahtar sıfır ile bir dizi geçerli bir PHP yapı değildir. Oluşturmak için çalışırsanız, bir PHP sizin için bir int içine sıfır dönecek. Eğer bunun için bir tanımı olmayan bir döküm yapmak için PHP sormak, (çünkü burada ne yapılması gerektiği etrafında kötü tanımlanmış kurallar) bir dize anahtar ile bir dizi oluşturmak biter.

Bu zayıf yazılı olan bir dilde doğru davranışını tanımlayan, PHP kısmında "yanlış" bir davranış olduğunu bariz olsa da kolay değildir.

Sen sadece bir nesne (stdClass) ziyade bir dizi olarak erişebilirsiniz:

$json = '{"0" : "a"}';
$obj = json_decode($json);
print_r($obj);
echo("a0:".$obj->{"0"}."<br>");

JavaScript bir nesne ({}) ziyade bir dizi [] ile başlamak beri bu en basit.

Alternatif olarak, bunu yapabilirsiniz

$arr = json_decode($json, true);

The second optional parameter makes it output an associative array. http://us.php.net/json_decode

Bunu neden yapıyorsun? Eğer JSON doğrudan bir dizi gibi değerleri deşifre olabilir biliyor musunuz?

$arr = json_decode($json, true);

echo '<pre>';
print_r($arr);
echo '</pre>';
Array ( [0] => a ) a0:
Array ( [0] => b ) b0:b

PHP'nin yararsızdır print_r saldırıları yine!

(array) dökme düz bir liste gibi diziye çevirmek için çalışır, çünkü ilk dizi, bir tamsayı tuşuna 0 vardır.

İkinci dizi ilişkisel-dizi-string anahtarı '0' Eğer bunu inşa korur.

var_export yerine print_r kullanımı ve daha kolay fark görebilirsiniz.

Ilk nesne [sayısal vardır özellikleri aka] izin verilmez özelliklere sahiptir Eh, sorun yalnızca var. Bu ancak diziye nesneleri dönüştürme ilgili herhangi bir işlem için, json_encode / kod çözme ile ilgili değildir. Tüm sayı anahtarları erişilemez hale olacaktır.

Bir nesne bir dizi dönüştürülür ise, sonuç olan elemanları nesnenin özellikleri olduğu bir dizidir: - http://www.php.net/manual/en/language.types.array.php o işaret nerede. Anahtarlar, bir kaç istisnai durum dışında, üyelerin isimleridir: Tamsayı özellikler erişilebilir değildir; Özel değişkenler değişken adına önüne sınıf adı var; korumalı değişkenleri bir '*' değişken adına önüne var. Bu önüne değerler her iki tarafta boş bayt var.