- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
假设我有以下代码:
<?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
始终后跟一个变量,而不是表达式。
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';
关于php - 通过 ArrayAccess 访问多维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32471857/
编辑:我意识到文字的数量可能令人生畏。本题实质: 如何以可以设置多维值的方式实现 ArrayAccess? 我知道有人对此进行了讨论 here已经,但我似乎无法正确实现 ArrayAccess 接口(
我一直在SPL 上阅读PHP 的常用接口(interface),例如Iterator、Countable 和ArrayAccess。但是,我不明白它们是如何工作的。 他们的实现是否修改了 PHP 的核
我有两个类,即 foo 和 Bar class bar extends foo { public $element = null; public function __construc
我如何在我的静态类中使用数组访问?F.e.我喜欢执行下一个脚本: class A { ... } A['p'] = 15; echo isset(A['p']) ? A['p'] : 0; 最佳
假设我有以下代码: var = array( 'a' => array('b' => 'c'), 'd' => array('e' => 'f'),
array_values() 不适用于 ArrayAccess 对象。array_keys() 也没有 为什么? 如果我可以访问 $object['key'] 我应该能够进行所有类型的数组操作 最佳答
这两个有什么区别?从 API 文档来看,它们似乎是为了做完全相同的事情。 ArrayAccess 对比 ArrayIndex 在这种情况下,它们似乎是多余的,所以我一定在这里遗漏了一些东西。 最佳答案
首先,引用关于 ArrayAccess::offsetSet() 的 ole' 手册: This function is not called in assignments by reference
我有一个实现 ArrayAccess 的类,我正试图让它与多维数组一起工作。 exists 和 get 起作用。 set 和 unset 给我带来了问题。 class ArrayTest implem
我正在使用提供的解决方案将批量操作的复选框添加到 CRUD 列表 here . 但是,我的结果是用 Pagerfanta 分页的,所以我似乎需要在我的表单中使用 DataMapper。 我尝试了各种解
有什么办法可以使用array_merge() , array_pop() , .. 可以与 ArrayAccess 一起使用的函数吗? 从现在开始我已经尝试过Iterate接口(interface)和
当一个类实现了ArrayAccess 接口(interface)时,它就可以作为数组发挥作用,完成 OffsetGet、OffsetSet 等。 我没有看到的一件事是当我们想要 count() 或 s
我的表单有问题,每次我想保存评论时都会出现此错误: Expected argument of type array or Traversable and ArrayAccess, object giv
我需要转型 xyz[3].aaa[1].bbb[2].jjj 至 getXyz(3).getAaa(1).getBbb(2).getJjj() 使用JDT核心。 用一些 getter 方法替换 Arr
这是我尝试实现 https://www.php.net/manual/en/class.iterator.php对于 ArrayAccess。许多示例使用容器数组作为私有(private)成员变量;但
我有一个对象,它是对象的集合,表现得像一个数组。它是一个数据库结果对象。类似于以下内容: $users = User::get(); foreach ($users as $user) ech
在 PHP 中实现 ArrayAccess 接口(interface),我们可以访问对象属性作为数组键。让对象的行为像数组有什么好处? 就像我看到使用 ArrayAccess Interface 实现
我有以下文件: obj = new obj; } } // obj taken from PHP ArrayAccess page as example, contents not imp
是否可以允许实现 ArrayAccess 的数组或对象? 例如: class Config implements ArrayAccess { ... } class I_Use_A_Confi
在PHP中,一个类可以实现ArrayAccess接口(interface),所以类可以像这样被实例化和访问: class MyClass implements ArrayAccess { prot
我是一名优秀的程序员,十分优秀!