通过ArrayAccess访问多维数组

时间:2015-09-09 05:54:18

标签: php arrays spl

说我有以下代码:

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

2 个答案:

答案 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后跟一个变量,而不是表达式。

演示:

https://3v4l.org/4jGMN

  

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

答案 1 :(得分:0)

您正在从班级打印出数组。试试这个

$test = new test();
$data = $test -> var;
$data['a']['b']= 'ssss';

print_r($data) ;

希望得到这个帮助。