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

2022-08-30 15:06:20

我有一个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

如何访问这些值?

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


答案 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

答案 2

如果需要数组,请将 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]));