说我有以下代码:
<?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 - 这似乎过多了。
答案 0 :(得分:1)
问题是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
的输出Array ( [a] => Array ( [b] => zzz ) [d] => Array ( [e] => f ) [g] => Array ( [h] => i ) )
您甚至可以将其简化为:
function &offsetGet($offset)
{
return $this->v[$offset];
}
因为如果通过引用返回不存在的变量,则会隐式创建它们。这样,您可以创建新的嵌套元素,如下所示:
$test['new']['nested'] = 'xxx';
答案 1 :(得分:0)
您正在从班级打印出数组。试试这个
$test = new test();
$data = $test -> var;
$data['a']['b']= 'ssss';
print_r($data) ;
希望得到这个帮助。