当我有引用但无法对键进行硬编码时,如何为关联数组分配值?
情况:
我有一个未知深度的关联数组,必须遍历。分支的末尾是一个数组,我必须对其求和并将其分配回该分支。
$array = [
foo => [
a => [1, 2],
b => [3, 4]
];
$pointer =& $array['foo']['b']; //in live the keys are variable.
$pointer = array_sum($pointer);
我想要的是$array
,现在看起来像:
[
foo => [
a => [1,2],
b => 7
]
]
但是,以上代码创建了一个新变量$pointer
,它的值是7,而没有更改$array
。如何仅用指针更新$array['foo']['b']
?我可能会发现其中涉及的密钥,但是它们是可变的,因此不确定是否有帮助。
-编辑:
用户jh1711指出我的代码段确实有效。原来我代码中的问题就在我复制引用之前。
这不起作用:
$pointer =& $mainPointer[$key];
这确实有效:
$pointer =& $mainPointer;
$pointer =& $pointer[$key];
我不确定第一个失败的原因,但是我的代码现在可以运行了!
答案 0 :(得分:2)
以下是您首次尝试失败的原因。查看评论。
这是错误的代码。
$array = [
'foo' => [
'a' => [1, 2],
'b' => [3, 4]
]
];
$pointer =& $array['foo']['b']; // $pointer now has type array
$pointer = array_sum($pointer); // $pointer now has type integer, so no array assignment
这是正确的代码。
$pointer =& $array['foo']['b']; // $pointer now has type array
$sum = array_sum($pointer); // $sum is type integer
$pointer = $sum; // assign integer $sum to array $pointer
这是工作时偷偷摸摸的旧PHP动态键入。 array_sum();
返回整数类型,这样做还将$ pointer转换为整数类型,从而阻止正确的数组分配。如有疑问,请在调试时在分配后使用gettype($value)
。