当转换为array
具有有效整数的字符串键的对象时会出现问题。
如果你有这个对象:
object(stdClass)#1 (2) {
["207"]=>
string(3) "sdf"
["210"]=>
string(3) "sdf"
}
然后你用
$array = (array)$object
你得到这个数组
array(2) {
["207"]=>
string(3) "sdf"
["210"]=>
string(3) "sdf"
}
它具有只能通过循环访问它们的键,因为直接访问 like$array["207"]
将始终转换为$array[207]
,它不存在。
因为你得到一个像上面这样的对象,从json_decode()
应用到一个字符串,比如
$json = '{"207":"sdf", "210":"sdf"}'
最好的解决方案是首先避免使用数字键。这些可能更好地建模为对象数组的数字属性:
$json = '[{"numAttr":207, "strAttr":"sdf"}, {"numAttr":210, "strAttr":"sdf"}]'
与目前的数据结构相比,这种数据结构有几个优点:
- 它更好地反映了原始数据,作为具有数字属性的对象的集合
- 它很容易与其他属性一起扩展
- 它在不同的系统之间更具可移植性(如您所见,您当前的数据结构导致 PHP 出现问题,但如果您碰巧使用另一种语言,您可能很容易遇到类似问题)。
如果需要一个property → object map,可以很快得到,例如,像这样:
function getNumAttr($obj) { return $obj->numAttr; } // for backward compatibility
$arr = json_decode($json); // where $json = '[{"numAttr":...
$map = array_combine(array_map('getNumAttr', $arr), $arr);
另一种解决方案是按照 ascii-lime 的建议进行操作:json_decode()
通过将其第二个参数设置为:强制输出关联数组而不是对象true
:
$map = json_decode($json, true);
对于您的输入数据,这会直接产生
array(2) {
[207]=>
string(3) "sdf"
[210]=>
string(3) "sdf"
}
请注意,数组的键现在是整数而不是字符串。
不过,我会考虑将 JSON 数据结构更改为更简洁的解决方案,尽管我知道这样做可能是不可能的。