首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >利用ArrayAccess访问多维数组

利用ArrayAccess访问多维数组
EN

Stack Overflow用户
提问于 2015-09-09 05:54:17
回答 2查看 76关注 0票数 4

假设我有以下代码:

代码语言:javascript
复制
<?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);

我想要做的是展示这样的东西:

代码语言:javascript
复制
Array
(
    [a] => Array
        (
            [b] => zzz
        )

    [d] => Array
        (
            [e] => f
        )

    [g] => Array
        (
            [h] => i
        )

)

它实际上显示的更像这样:

代码语言:javascript
复制
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 --这似乎太过了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-09 06:47:31

问题是offsetGet按值返回数组,即内部值的副本。$test['a']['b'] = 'zzz'对此副本进行操作,由$test['a']返回。

但是您可以让offsetGet返回一个引用:

代码语言:javascript
复制
    function &offsetGet($offset)
    {
        $null = null;
        if (isset($this->var[$offset])) {
            return $this->var[$offset];
        }
        return $null;
    }

注意,我还必须修改方法主体,以便return后面总是有一个变量,而不是表达式。

演示:

https://3v4l.org/4jGMN

输出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))

更新

您甚至可以将其简化为:

代码语言:javascript
复制
function &offsetGet($offset)
{
    return $this->v[$offset];
}

因为如果通过引用返回不存在的变量,则它们是隐式创建的。这样,您可以创建新的嵌套元素,如下所示:

代码语言:javascript
复制
$test['new']['nested'] = 'xxx';

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

票数 1
EN

Stack Overflow用户

发布于 2015-09-09 06:15:06

您正在打印类中的数组。尝尝这个

代码语言:javascript
复制
$test = new test();
$data = $test -> var;
$data['a']['b']= 'ssss';

print_r($data) ;

希望能帮上忙。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32471857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档