加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 通过ArrayAccess访问多维数组

发布时间:2020-12-13 15:57:56 所属栏目:PHP教程 来源:网络整理
导读:说我有以下代码: ?phpclass 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-va
说我有以下代码:

<?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;
    }

请注意,我还必须修改方法体,因此返回后总是后跟变量,而不是表达式.

演示:

https://3v4l.org/4jGMN

Output for 5.4.7 – 7.0.0rc2,hhvm-3.6.1 – 3.9.0

06001

更新

您甚至可以将其简化为:

function &offsetGet($offset)
{
    return $this->v[$offset];
}

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

$test['new']['nested'] = 'xxx';

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读