为什么以下
$a = new SplFixedArray(5);
$a[0] = array(1, 2, 3);
$a[0][0] = 12345; // here
var_dump($a);
Run Code Online (Sandbox Code Playgroud)
产生
Notice: Indirect modification of overloaded element of SplFixedArray has no effect in <file> on line <indicated>
Run Code Online (Sandbox Code Playgroud)
这是一个错误吗?那么你如何处理多维SplFixedArrays呢?任何解决方法?
hek*_*mgl 39
首先,问题与实现ArrayAccess它的所有类SplFixedArray只有一个特殊问题有关.
当您SplFixedArray使用[]运算符访问元素时,它的行为与数组不完全相同.在内部offsetGet()调用它的方法,并在你的情况下返回一个数组 - 但不是对该数组的引用.这意味着$a[0]除非您将其保存,否则您所做的所有修改都将丢失:
解决方法:
$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);
Run Code Online (Sandbox Code Playgroud)
下面是使用标量失败的示例 - 只是为了向您显示它与数组元素无关.
如果您&在前面打了个掌,这实际上是可以解决的offsetGet(假设您可以访问实现的内部ArrayAccess):
class Dict implements IDict {
private $_data = [];
/**
* @param mixed $offset
* @return bool
*/
public function offsetExists($offset) {
return array_key_exists(self::hash($offset), $this->_data);
}
/**
* @param mixed $offset
* @return mixed
*/
public function &offsetGet($offset) {
return $this->_data[self::hash($offset)];
}
/**
* @param mixed $var
* @return string
*/
private static function hash($var) {
return is_object($var) ? spl_object_hash($var) : json_encode($var,JSON_UNESCAPED_SLASHES);
}
/**
* @param mixed $offset
* @param mixed $value
*/
public function offsetSet($offset, $value) {
$this->_data[self::hash($offset)] = $value;
}
/**
* @param mixed $offset
*/
public function offsetUnset($offset) {
unset($this->_data[self::hash($offset)]);
}
}
Run Code Online (Sandbox Code Playgroud)