如何基于PHP中的引用分配值

时间:2018-08-10 23:10:36

标签: php arrays reference associative-array

当我有引用但无法对键进行硬编码时,如何为关联数组分配值?

情况:
我有一个未知深度的关联数组,必须遍历。分支的末尾是一个数组,我必须对其求和并将其分配回该分支。

$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];

我不确定第一个失败的原因,但是我的代码现在可以运行了!

1 个答案:

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