一尘不染

不能使用带有数字键作为字符串的PHP数组

json

我有一个将数字键作为字符串类型的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"]);

输出:

数组(大小= 2)
    '1'=>整数1
    '2'=>整数2

布尔值false

布尔值false

错误:E_NOTICE:未定义的偏移量:1

空值

错误:E_NOTICE:未定义的偏移量:1

空值

如何访问这些值?

演示:http//codepad.viper-7.com/8O03IM


阅读 262

收藏
2020-07-27

共1个答案

一尘不染

因此,我还没有看到其他答案可以解决这个问题,但是@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
2020-07-27