Php (数组)类型转换奇怪行为对象到数组的转换
前面我有一些代码块,它工作得很好,但在某些情况下,它会引发PHP注意: 代码如下:Php (数组)类型转换奇怪行为对象到数组的转换,php,json,Php,Json,前面我有一些代码块,它工作得很好,但在某些情况下,它会引发PHP注意: 代码如下: $json = '{"1455260079":"Tracking : #34567808765098767 USPS","1455260723":"Delivered","1455261541":"Received Back"}'; $json_obj = json_decode($json); $json_array = (array) $json_obj; var_dump($json_array); pr
$json = '{"1455260079":"Tracking : #34567808765098767 USPS","1455260723":"Delivered","1455261541":"Received Back"}';
$json_obj = json_decode($json);
$json_array = (array) $json_obj;
var_dump($json_array);
print_r($json_array);
echo $json_array["1455260079"]."\n";
输出:
array(3) {
["1455260079"]=>
string(34) "Tracking : #34567808765098767 USPS"
["1455260723"]=>
string(9) "Delivered"
["1455261541"]=>
string(13) "Received Back"
}
Array
(
[1455260079] => Tracking : #34567808765098767 USPS
[1455260723] => Delivered
[1455261541] => Received Back
)
Notice: Undefined index: 1455260079 in /in/PULrp on line 14
array(3) {
[1455260079]=>
string(34) "Tracking : #34567808765098767 USPS"
[1455260723]=>
string(9) "Delivered"
[1455261541]=>
string(13) "Received Back"
}
Array
(
[1455260079] => Tracking : #34567808765098767 USPS
[1455260723] => Delivered
[1455261541] => Received Back
)
Tracking : #34567808765098767 USPS
$json_array = (array) $json_obj;
所以我用下面的代码修改了上面的代码,它工作得很好
$json_array = json_decode($json, true);
var_dump($json_array);
print_r($json_array);
echo $json_array["1455260079"]."\n";
输出:
array(3) {
["1455260079"]=>
string(34) "Tracking : #34567808765098767 USPS"
["1455260723"]=>
string(9) "Delivered"
["1455261541"]=>
string(13) "Received Back"
}
Array
(
[1455260079] => Tracking : #34567808765098767 USPS
[1455260723] => Delivered
[1455261541] => Received Back
)
Notice: Undefined index: 1455260079 in /in/PULrp on line 14
array(3) {
[1455260079]=>
string(34) "Tracking : #34567808765098767 USPS"
[1455260723]=>
string(9) "Delivered"
[1455261541]=>
string(13) "Received Back"
}
Array
(
[1455260079] => Tracking : #34567808765098767 USPS
[1455260723] => Delivered
[1455261541] => Received Back
)
Tracking : #34567808765098767 USPS
$json_array = (array) $json_obj;
但在这里,我有点困惑,为什么(数组)
类型转换在这段代码中不起作用。我知道json\u decode($json,true)
是将json字符串转换为数组的最佳选择,但是$json\u array=(array)$json\u obj代码>也是一个有效的选项
在查看两个代码的var\u dump
时,它显示了一些差异,但两个数组的print\r
完全相同
我很想知道为什么两者的var\u dump
中会出现这样的差异,以及(数组)
类型转换在第一种情况下是如何将对象转换为数组的
我还注意到,如果密钥是数字,即1455260079,则会发生这种情况,如果我将密钥1455260079更改为某个字符串,则它将按预期工作
您可以在以下位置看到完整代码的输出:这里有一些发现:
引自:
他们说:
包含有效整数的字符串将强制转换为整数类型。例如,键“8”实际上将存储在8下。另一方面,“08”不会被强制转换,因为它不是有效的十进制整数
有趣的是(稍微修改一下测试脚本):
请注意两个数组中键的类型-强制转换的数组具有(数字)string
键,而重新分配的数组具有integer
键
将对象强制转换为数组时,键在某种程度上仍然是一个字符串
。根据上面的引文,PHP对数组的定义并不期望出现这种情况
因此,当您尝试使用“数字字符串”访问数组时,PHP仍然将字符串
视为整数
,但在内部,键仍然是字符串,导致数组未定义
这也意味着对于关联数组,键比较实际上是严格的,但实际上是松散的。原因在PHP手册中给出
第一种情况(未定义索引错误):
array(3) {
["1455260079"]=>
string(34) "Tracking : #34567808765098767 USPS"
["1455260723"]=>
string(9) "Delivered"
["1455261541"]=>
string(13) "Received Back"
}
Array
(
[1455260079] => Tracking : #34567808765098767 USPS
[1455260723] => Delivered
[1455261541] => Received Back
)
Notice: Undefined index: 1455260079 in /in/PULrp on line 14
array(3) {
[1455260079]=>
string(34) "Tracking : #34567808765098767 USPS"
[1455260723]=>
string(9) "Delivered"
[1455261541]=>
string(13) "Received Back"
}
Array
(
[1455260079] => Tracking : #34567808765098767 USPS
[1455260723] => Delivered
[1455261541] => Received Back
)
Tracking : #34567808765098767 USPS
$json_array = (array) $json_obj;
给出于:
如果将对象转换为数组,则结果是
元素是对象的属性。键是成员变量
名称,但有几个显著的例外:整数属性是
不可访问的
因此,您应该使用json\u decode($json\u string,true)
来获得关联数组
第二种情况(与打印和变量转储的差异):
array(3) {
["1455260079"]=>
string(34) "Tracking : #34567808765098767 USPS"
["1455260723"]=>
string(9) "Delivered"
["1455261541"]=>
string(13) "Received Back"
}
Array
(
[1455260079] => Tracking : #34567808765098767 USPS
[1455260723] => Delivered
[1455261541] => Received Back
)
Notice: Undefined index: 1455260079 in /in/PULrp on line 14
array(3) {
[1455260079]=>
string(34) "Tracking : #34567808765098767 USPS"
[1455260723]=>
string(9) "Delivered"
[1455261541]=>
string(13) "Received Back"
}
Array
(
[1455260079] => Tracking : #34567808765098767 USPS
[1455260723] => Delivered
[1455261541] => Received Back
)
Tracking : #34567808765098767 USPS
$json_array = (array) $json_obj;
给出于:
此函数显示有关一个或多个的结构化信息
包含其类型和值的表达式。数组和对象是
使用缩进的值进行递归探索,以显示结构
以及:
如果给定一个字符串、整数或浮点,将打印值本身。
如果给定一个数组,值将以显示
关键和要素。类似的符号用于对象
因此,字符串将使用qoutes打印,其中包含var\u dump
,而print\u r
中没有qoutes,因此基本上不值得使用(数组)
类型转换,因为它将改变流的整个行为?除非对象上没有整数键,否则它似乎是(数组)
type cast应该避免,正如@limekin的回答所指出的那样。