Garip json_decode sonra eşleşen dizi tuşlarının davranışı ()

4 Cevap php

Benim PHP kodu bazı çok garip davranışları var. Neredeyse PHP bir hata gibi görünüyor çünkü bu, aslında iyi bir SO soru olup olmadığını bilmiyorum. Benim bir projede bu sorunu vardı ve sorunu izole:

// json object that will be converted into an array
$json = '{"5":"88"}';
$jsonvar = (array) json_decode($json); // notice: Casting to an array
// Displaying the array:
var_dump($jsonvar);
// Testing if the key is there
var_dump(isset($jsonvar["5"]));
var_dump(isset($jsonvar[5]));

Bu kod aşağıdaki çıktılar:

array(1) {
  ["5"]=>
  string(2) "88"
}
bool(false)
bool(false)

The big problem: bu testlerin her ikisi de bool (true) üretmek olmalıdır - Eğer düzenli php dizileri kullanarak aynı dizi oluşturursanız, bu görürsünüz budur:

// Let's create a similar PHP array in a regular manner:
$phparr = array("5" => "88");
// Displaying the array:
var_dump($phparr);
// Testing if the key is there
var_dump(isset($phparr["5"]));
var_dump(isset($phparr[5]));

Bunun çıkışı:

array(1) {
  [5]=>
  string(2) "88"
}
bool(true)
bool(true)

Yani bu gerçekten mantıklı değil. PHP / apache iki farklı kurulumlarında bu test ettik.

Sen kopyalayıp yapıştırmak bunu test etmek için dosyayı kendiniz bir php için kodu.

Bu bir nesneden bir dizi döküm ile ilgili bir şey olmalı.

4 Cevap

Bundan başka, bu sorun için basitleştirilebilir

$o = new stdClass;
$o->{5} = 1; //or even $o->{'5'} = 1;
$a = (array) $o;
print_r($a);
var_dump(isset($a[5]));
var_dump(isset($a['5']));

Bu özellik adı php normalde bir dizi sayısal bir tuşa düşünün biri olduğunda bu yalnızca olur gibi görünüyor.

Benim için kesinlikle beklenmeyen bir davranış.


edit Same issue here http://stackoverflow.com/questions/1869812/casing-an-array-with-numeric-keys-as-an-object


edit#2 documented behavior http://www.php.net/manual/en/language.types.array.php#language.types.array.casting

Yerine bir nesneye kendinizi değişen bir dizi almak için json_decode işlev parametreleri kullanın.

json_decode ( string $json [, bool $assoc = false])
$assoc - When TRUE, returned object s will be converted into associative array s.

Sizin kod değiştirildi

$jsonvar = json_decode($json, true);

beklendiği gibi çalışır

<-> Nesne <-> dizi eşleştirmeleri Chris dediği gibi, json sınırlardan biri isabet vardır.

Bir json nesnesi önemli bir boş dize akılda tutulması gereken bir başka ilginç biridir.

json = '{"":"88"}';

anahtarı "empty" olarak php eşleştirilir olacak!

Gibi bir ifade kullanmak

$value = $a["'".$i."'"];

doğrudan gider çizgiyi takip

$a = json_decode($a, true);