Очередное неочевидное (??) поведение php

Wicked

Новичок
lol 8]

$json = '{"0" : "a"}';
$a = json_decode($json, true);
var_dump($a);
echo("a:".$a["0"]."<br>");

так работает, но от этого не легче :)
 

fixxxer

К.О.
Партнер клуба
fixxxer@devel ~$ php -r '$A=array("0"=>"a"); $a=(array)(object)$A; var_dump($a); echo($a["0"]); '
array(1) {
[0]=>
string(1) "a"
}
a
fixxxer@devel ~$ php -r '$A=(object)array("0"=>"a"); $a=(array)$A; var_dump($a); echo($a["0"]); '
array(1) {
[0]=>
string(1) "a"
}
a
fixxxer@devel ~$ php -r '$O=new stdClass;$O->{"0"}="a"; $a=(array)$O; var_dump($a); echo($a["0"]); '
array(1) {
["0"]=>
string(1) "a"
}
PHP Notice: Undefined index: 0 in Command line code on line 1

бугагага

-~{}~ 18.05.10 16:14:

давайте опять кто-нибудь придет и расскажет, где это задокументировано и что это фича :D
 

zerkms

TDD infected
Команда форума
fixxxer
да легко - нельзя объекту свойства с именем "0" давать )) почему пхп не вываливает на это действие ворнинг и всё равно присваивает? ну вот такой вот пхп ))
 

Fortop

Новичок
Это уже ловили?
PHP:
<?php
$p = new stdClass;
$p->a = 1;
$r = array('a' => 1);

var_dump(json_decode(json_encode($p)));
var_dump(json_decode(json_encode($r)));
Это правда не вина php, но все же.
 

Wicked

Новичок
Fortop
в твоем-то случае что не так? .-) это все логично, что теряется изначальная информация о типе данных...
 

mz

Новичок
Fortop
выше же было:
PHP:
var_dump(json_decode(json_encode($p)));
var_dump(json_decode(json_encode($r), true));
и все будет логично ;)
 

dimagolov

Новичок
Fortop, это проблема JS вообще и JSON в частности, в которых нет не-числовых индексов в массивах. PHP тут виноват лишь в том, что умеет то, что не умеет JS. Просто нужно понимать, что json_decode это не обратная ф-я для json_encode на всей области определения json_encode. А вот обратное утверждение верно, json_encode будет обратной ф-ей для json_decode на всей области определения json_decode.
 

fixxxer

К.О.
Партнер клуба
ай рипит

fixxxer@devel ~$ php -r '$A=(object)array("0"=>"a"); $a=(array)$A; var_dump($a); echo($a["0"]); '
array(1) {
[0]=>
string(1) "a"
}
a
fixxxer@devel ~$ php -r '$O=new stdClass;$O->{"0"}="a"; $a=(array)$O; var_dump($a); echo($a["0"]); '
array(1) {
["0"]=>
string(1) "a"
}
PHP Notice: Undefined index: 0 in Command line code on line 1

щито тут логичного?
совершенно как раз НЕЛОГИЧНО отсутствие кастинга "0"->0 в последнем случае. более того это явный баг (но зная типичную реакцию коре девелоперов - проще положить, тем более что баг совершенно не критичный, проще говоря пофигу)
 

slash

Новичок
fixxxer
да легко - нельзя объекту свойства с именем "0" давать )) почему пхп не вываливает на это действие ворнинг и всё равно присваивает? ну вот такой вот пхп ))
потому что можно. потому что объекты и массивы внутри — это одно и то же.
PHP:
echo "a:",$a->{"0"} // a:a
 
Сверху