问题描述
为什么以下
$a = new SplFixedArray(5);
$a[0] = array(1, 2, 3);
$a[0][0] = 12345; // here
var_dump($a);
产生
Notice: Indirect modification of overloaded element of SplFixedArray has no effect in <file> on line <indicated>
它是一个错误吗?你如何处理与多维SplFixedArrays呢?任何变通办法?
Is it a bug? How do you deal with multidimensional SplFixedArrays then? Any workarounds?
推荐答案
首先,这个问题是关系到实现所有类 ArrayAccess接口
这不是一个特殊的问题 SplFixedArray
仅
First, the problem is related to all classes which implement ArrayAccess
it is not a special problem of SplFixedArray
only.
当您使用 []
运营商,它的行为不是完全像一个数组访问来自 SplFixedArray
元素。在内部它的 offsetGet()
方法被调用,并在您的案件阵列将返回 - 而不是引用以数组。这意味着你就 $所有修改一个[0]
会迷路,除非你将其重新保存:
When you accessing elements from SplFixedArray
using the []
operator it behaves not exactly like an array. Internally it's offsetGet()
method is called, and will return in your case an array - but not a reference to that array. This means all modifications you make on $a[0]
will get lost unless you save it back:
解决方法:
$a = new SplFixedArray(5);
$a[0] = array(1, 2, 3);
// get element
$element = $a[0];
// modify it
$element[0] = 12345;
// store the element again
$a[0] = $element;
var_dump($a);
下面是使用标这也失败了一个例子 - 只是为了告诉你,这是不相关的只有数组元素
Here is an example using a scalar which fails too - just to show you that it is not related to array elements only.
这篇关于&QUOT; SplFixedArray重载元素的间接修改没有影响&QUOT;的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!