4

当您对d 值(使用)进行array类型转换时,PHP 会创建一个带有字符串索引的数组:json_decode$assoc = false

$a = (array)json_decode('{"7":"value1","8":"value2","9":"value3","13":"value4"}');

var_export($a);

//array (
//  '7' => 'value1',
//  '8' => 'value2',
//  '9' => 'value3',
//  '13' => 'value4',
//)

由于某种原因,这些索引无法访问:

var_dump(isset($a[7]), isset($a['7']));

//false
//false

当您尝试通过 PHP 本身创建相同的数组时,它是使用数字索引创建的(字符串会自动转换),并且可以使用字符串和数字访问值:

$c = array('7' => 'value1', '8' => 'value2', '9' => 'value3','10' => 'value4');

var_export($c);

var_dump(isset($c[7]), isset($c['7']));

//array (
//  7 => 'value1',
//  8 => 'value2',
//  9 => 'value3',
//  13 => 'value4',
//)
//
//true
//true

有人知道这里发生了什么吗?是否是旧 PHP 版本的一些错误(该问题似乎已在 PHP 版本 >= 7.2 上得到修复,但我在changelog中找不到任何相关内容)?

这是正在发生的事情的演示:https ://3v4l.org/da9CJ 。

4

3 回答 3

3

这似乎与7.2.0 中修复的错误 #61655有关:

在对象属性中按名称查找总是在字符串中,但在数组中,数字字符串(如 "22200" )键将转换为数字但不再是字符串。当转换内部 HashTable 没有改变时,转换后,键查找将失败。

澄清:$a["2000"]总是被解释为$a[2000],但(array)未能将对象字符串键转换为数字。因此数组包含字符串数字索引,但数组语法的自动转换阻止了这些索引的访问。

于 2018-01-22T11:02:55.470 回答
0

添加TRUEjson_decode()

<?php
$a = json_decode('{"7":"value1","8":"value2","9":"value3","13":"value4"}',TRUE);

var_export($a);

var_dump(isset($a[7]), isset($a['7']));

https://3v4l.org/YuF9B

于 2018-01-22T11:03:43.390 回答
0

将 TRUE 添加到 json_decode() 是可能的,但它会重新编码所有内容。

因为您必须更改对变量的访问。

如果你的 json 看起来像这样:

$return = '{"status":"ok","message":"","code":"200","data":{"1234":{"sid":1,"name":"foo"},"4321":{"sid":2,"name":"bar"}}}';

上:

$json_data = json_decode($return, true);
$data = $json_data['data'];

您可以循环 $data 并且必须以数组的形式访问值: $data[0]['name'] ...

上:

$json_data = json_decode($return);
$data = (array) $json_data->data;

您可以循环 $data 并且必须将值作为对象访问: ​​$data[0]->name ...

于 2018-07-19T10:09:35.260 回答