假设我有以下代码:
<?php
class test implements ArrayAccess {
var $var;
function __construct()
{
$this->var = array(
'a' => array('b' => 'c'),
'd' => array('e' => 'f'),
'g' => array('h' => 'i')
);
}
function offsetExists($offset)
{
return isset($this->var);
}
function offsetGet($offset)
{
return isset($this->var[$offset]) ? $this->var[$offset] : null;
}
function offsetSet($offset, $value)
{
if (is_null($offset)) {
$this->var[] = $value;
} else {
$this->var[$offset] = $value;
}
}
function offsetUnset($offset)
{
unset($this->var[$offset]);
}
}
$test = new test();
$test['a']['b'] = 'zzz';
print_r($test->var);我想要做的是展示这样的东西:
Array
(
[a] => Array
(
[b] => zzz
)
[d] => Array
(
[e] => f
)
[g] => Array
(
[h] => i
)
)它实际上显示的更像这样:
Array
(
[a] => Array
(
[b] => c
)
[d] => Array
(
[e] => f
)
[g] => Array
(
[h] => i
)
)即。$test['a']['b']没有变化。
你知道我怎么才能用那个语法来改变它吗?我可以将$test['a']赋值给一个变量,然后执行$temp['b'] = 'zzz';,然后执行$test['a'] = $temp;,但是idk --这似乎太过了。
发布于 2015-09-09 06:47:31
问题是offsetGet按值返回数组,即内部值的副本。$test['a']['b'] = 'zzz'对此副本进行操作,由$test['a']返回。
但是您可以让offsetGet返回一个引用:
function &offsetGet($offset)
{
$null = null;
if (isset($this->var[$offset])) {
return $this->var[$offset];
}
return $null;
}注意,我还必须修改方法主体,以便return后面总是有一个变量,而不是表达式。
演示:
输出5.4.7 - 7.0.0rc2,hhvm-3.6.1 - 3.9.0 数组(a => Array (b => zzz )d => Array (e => f)g => Array (h => i))
更新
您甚至可以将其简化为:
function &offsetGet($offset)
{
return $this->v[$offset];
}因为如果通过引用返回不存在的变量,则它们是隐式创建的。这样,您可以创建新的嵌套元素,如下所示:
$test['new']['nested'] = 'xxx';发布于 2015-09-09 06:15:06
您正在打印类中的数组。尝尝这个
$test = new test();
$data = $test -> var;
$data['a']['b']= 'ssss';
print_r($data) ;希望能帮上忙。
https://stackoverflow.com/questions/32471857
复制相似问题