Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php (数组)类型转换奇怪行为对象到数组的转换_Php_Json - Fatal编程技术网

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

前面我有一些代码块,它工作得很好,但在某些情况下,它会引发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);
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的回答所指出的那样。