gpt4 book ai didi

php - 通过 ArrayAccess 访问多维数组

转载 作者:可可西里 更新时间:2023-10-31 23:39:00 24 4
gpt4 key购买 nike

假设我有以下代码:

<?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 - 这似乎过分了。

最佳答案

问题是 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 始终后跟一个变量,而不是表达式。

演示:

https://3v4l.org/4jGMN

Output for 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';

演示:https://3v4l.org/OSvuA

关于php - 通过 ArrayAccess 访问多维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32471857/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com