我有一个PHP数组,其数字键作为字符串类型.
但是当我尝试访问它们时,PHP会给我一个未定义的索引错误.
$a = (array)json_decode('{"1":1,"2":2}');
var_dump($a);
var_dump(isset($a[1]));
var_dump(isset($a["1"]));
var_dump($a[1]);
var_dump($a["1"]);
输出:
array (size=2)
    '1' => int 1
    '2' => int 2
boolean false
boolean false
ERROR: E_NOTICE: Undefined offset: 1
null
ERROR: E_NOTICE: Undefined offset: 1
null
我如何访问这些值?
Mik*_*osh 28
所以,我还没有看到任何其他答案,但是@xdazz接近了.
让我们开始我们的环境,$obj等于解码字符串的对象表示法:
php > $obj = json_decode('{"1":1,"2":2}');
php > print_r($obj);
stdClass Object
(
    [1] => 1
    [2] => 2
)
php > var_dump( $obj );
object(stdClass)#1 (2) {
  ["1"]=>
  int(1)
  ["2"]=>
  int(2)
}
如果要访问字符串,我们知道以下内容将失败:
php > echo $obj->1;
Parse error: parse error, expecting `T_STRING' or `T_VARIABLE' or `'{'' or `'$'' in php shell code on line 1
访问对象变量
您可以像这样访问它:
php > echo $obj->{1};
1
这跟说:
php > echo $obj->{'1'};
1
访问数组变量
数组的问题是以下返回空白,这是类型转换的问题.
php > echo $obj[1];
php >
如果将其类型转换回来,则可以再次访问该对象:
php > $obj = (object) $obj;
php > echo $obj->{1};
1
这是一个为您自动执行上述操作的功能:
function array_key($array, $key){
    $obj = (object) $array;
    return $obj->{$key};
}
用法示例:
php > $obj = (array) $obj;
php > echo array_key($obj, 1);
1
php > echo array_key($obj, 2);
2
xda*_*azz 26
如果需要数组,请将json_decode的第二个参数设置为true.
$a = json_decode('{"1":1,"2":2}', true);
编辑: 当您将std对象强制转换为数组时,数字字符串键不会强制转换为数字.这是一个例子.
$obj = new stdClass;
$obj->{'1'} = 1;
$arr = (array) $obj;
var_dump($arr);
var_dump(isset($arr[1]));
小智 15
显然,这是一个已知问题,并没有计划解决它; 看Doc Bug#45959数组转换对象导致奇怪的行为:
修正意味着性能降低,因此似乎更好地将其作为已知问题保留,但记录在案.
如果将对象转换为数组,则结果是一个数组,其元素是对象的属性.键是成员变量名,有一些值得注意的例外:整数属性是不可访问的 ....这可能会导致一些意外的行为....