我有一个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
如何访问这些值?
答案 0 :(得分: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
答案 1 :(得分: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]));
答案 2 :(得分:15)
显然,这是一个已知问题,并没有计划解决它;见Doc Bug #45959 Object to array conversion leads to weird behaviour:
修复意味着性能降低,因此似乎将其作为一个已知问题保存得更好,但记录在案。
在documentation for the array type(强调我的)中注意到(然后)这种不满:
如果将对象转换为数组,则结果是一个数组,其元素是对象的属性。键是成员变量名,但有一些值得注意的例外:整数属性不可访问 ....这可能会导致一些意外行为....
答案 3 :(得分:1)
是。我同意,PHP在从对象到数组的类型转换方面存在问题,但是foreach正在智能地处理对象或关联数组。
$a = json_decode('{"1":1,"2":2}'); //need not typecast but doesnt break even if u typecast
foreach ($a as $k=>$v){
echo $v;
}
答案 4 :(得分:1)
我最近遇到了同样的问题。
$obj = new stdClass();
$obj->{'0'} = "test";
$array = (array)$obj;
foreach ($array as $key => $value) {
$array[$key] = strtoupper($value);
}
var_dump($array);
此代码输出:
array(2) {
["0"]=>
string(4) "test"
[0]=>
string(4) "TEST"
}
发现在调试将recursivly对象转换为数组的方法时,我已经疯了。
答案 5 :(得分:1)
我遇到了同样的问题(但是使用了array_intersect_key)。
这是我的解决方案:
$array = array_combine(array_keys($array), $array);