- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
<?php
$a = new ArrayObject();
$a['b'] = array('c'=>array('d'));
print_r($a);
unset($a['b']['c']);
print_r($a);
ArrayObject Object
(
[b] => Array
(
[c] => Array
(
[0] => d
)
)
)
ArrayObject Object
(
[b] => Array
(
[c] => Array
(
[0] => d
)
)
)
您注意到 $a['b']['c']
仍然存在,即使在取消设置之后也是如此。我希望 $a
只剩下一个值 (b
)。
在我的实际应用中,我收到以下警告:
Indirect modification of overloaded element of MyClass has no effect
其中 MyClass
扩展了 ArrayObject
。我有很多代码依赖于能够像这样取消设置嵌套元素,那么我怎样才能让它工作?
最佳答案
一种方法
<?php
$a = new ArrayObject();
$a['b'] = array('c' => array('d'));
$d =& $a['b'];
unset($d['c']);
print_r($a['b']);
打印:
Array
(
)
对于为什么您最初使用的语法没有删除该元素的解释,需要多考虑一下。
编辑:行为解释
发生的事情是对 unset($a['b']['c']);
的调用被翻译成:
$temp = $a->offsetGet('b');
unset($temp['c']);
由于 $temp
是 $a
的副本而不是对它的引用,PHP 在内部使用写时复制并创建第二个数组,其中 $temp
没有 ['b']['c']
,但 $a
仍然有。
另一个编辑:可重用代码
因此,无论您以何种方式对其进行切片,似乎都试图将 function offsetGet($index)
重载为 function &offsetGet($index)
会导致麻烦;所以这是我想出的最短的辅助方法,可以将它作为静态方法或实例方法添加到 ArrayObject
的子类中,无论您的船如何漂浮:
function unsetNested(ArrayObject $oArrayObject, $sIndex, $sNestedIndex)
{
if(!$oArrayObject->offSetExists($sIndex))
return;
$aValue =& $oArrayObject[$sIndex];
if(!array_key_exists($sNestedIndex, $aValue))
return;
unset($aValue[$sNestedIndex]);
}
所以原来的代码会变成
$a = new ArrayObject();
$a['b'] = array('c' => array('d'));
// instead of unset($a['b']['c']);
unsetNested($a, 'b', 'c');
print_r($a['b']);
另一个编辑:面向对象的解决方案
好的 - 所以今天早上我一定是手忙脚乱,因为我发现我的代码中有错误,修改后,我们可以基于 OO 实现解决方案。
只是想让你知道我试过了,扩展段错误..:
/// XXX This does not work, posted for illustration only
class BadMoxuneArrayObject extends ArrayObject
{
public function &offsetGet($index)
{
$var =& $this[$index];
return $var;
}
}
另一方面,实现装饰器就像一个魅力:
class MoxuneArrayObject implements IteratorAggregate, ArrayAccess, Serializable, Countable
{
private $_oArrayObject; // Decorated ArrayObject instance
public function __construct($mInput=null, $iFlags=0, $sIteratorClass='')
{
if($mInput === null)
$mInput = array();
if($sIteratorClass === '')
$this->_oArrayObject = new ArrayObject($mInput, $iFlags);
else
$this->_oArrayObject = new ArrayObject($mInput, $iFlags, $sIteratorClass);
}
// -----------------------------------------
// override offsetGet to return by reference
// -----------------------------------------
public function &offsetGet($index)
{
$var =& $this->_oArrayObject[$index];
return $var;
}
// ------------------------------------------------------------
// everything else is passed through to the wrapped ArrayObject
// ------------------------------------------------------------
public function append($value)
{
return $this->_oArrayObject->append($value);
}
public function asort()
{
return $this->_oArrayObject->asort();
}
public function count()
{
return $this->_oArrayObject->count();
}
public function exchangeArray($mInput)
{
return $this->_oArrayObject->exchangeArray($mInput);
}
public function getArrayCopy()
{
return $this->_oArrayObject->getArrayCopy();
}
public function getFlags()
{
return $this->_oArrayObject->getFlags();
}
public function getIterator()
{
return $this->_oArrayObject->getIterator();
}
public function getIteratorClass()
{
return $this->_oArrayObject->getIteratorClass();
}
public function ksort()
{
return $this->_oArrayObject->ksort();
}
public function natcassesort()
{
return $this->_oArrayObject->natcassesort();
}
public function offsetExists($index)
{
return $this->_oArrayObject->offsetExists($index);
}
public function offsetSet($index, $value)
{
return $this->_oArrayObject->offsetSet($index, $value);
}
public function offsetUnset($index)
{
return $this->_oArrayObject->offsetUnset($index);
}
public function serialize()
{
return $this->_oArrayObject->serialize();
}
public function setFlags($iFlags)
{
return $this->_oArrayObject->setFlags($iFlags);
}
public function setIteratorClass($iterator_class)
{
return $this->_oArrayObject->setIteratorClass($iterator_class);
}
public function uasort($cmp_function)
{
return $this->_oArrayObject->uasort($cmp_function);
}
public function uksort($cmp_function)
{
return $this->_oArrayObject->uksort($cmp_function);
}
public function unserialize($serialized)
{
return $this->_oArrayObject->unserialize($serialized);
}
}
现在这段代码可以正常工作了:
$a = new MoxuneArrayObject();
$a['b'] = array('c' => array('d'));
unset($a['b']['c']);
var_dump($a);
不过还是要修改一些代码..;我看不出有什么办法解决这个问题。
关于php - 如何使用 ArrayObject 取消设置嵌套数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9981884/
我试图理解文档中的 STD_PROP_LIST 常量,但到目前为止我不明白,也没有找到任何解释:(该文档有以下示例: $a = new ArrayObject(array(), ArrayObject
如果是,那么它与使用 arrayObject = [] 有何不同.这是两件事不同还是两种做同样的事情。 最佳答案 array.length = 0; 保留对原始数组的对象引用。 array = [];
我收到了这条通知: ArrayIterator::next(): Array was modified outside object and internal position is no longe
我想了解什么是getIterator(),我会解释一下: 据我所知,getIterator 是我们调用以包含外部迭代器的方法。 问题是 getIterator 包括它自己的方法 关闭认为看起来与 It
问题: 当手动设置或读取值时,ArrayObject 会按预期工作,但是当使用函数(例如 foreach)对其进行迭代时,事情会变得很糟糕。 它不调用我定义的 offset* 方法,而是使用 Arra
我在哪里可以找到 ArrayObject 的完整源代码(PHP 格式)? 我不明白的是为什么在向 ArrayObject 添加元素时可以使用“箭头”,例如: $a = new ArrayObject(
应该使用哪一个来操作数据,数组还是数组对象?像搜索、排序和其他数组操作。 最佳答案 基本类型是array。这是可以在循环中写入、读取和访问的键和值的映射。 ArrayObject 是一个类,您可以扩展
我正在尝试存储一个数组并使用扩展 ArrayObject 的自定义类来操作该数组。 class MyArrayObject extends ArrayObject { protected $d
我编写了一个使用 Class::ArrayObjects 的简单程序,但它没有按预期工作。程序是: TestArrayObject.pm: package TestArrayObject; use C
ideone 示例代码: array('d')); print_r($a); unset($a['b']['c']); print_r($a); 输出 ArrayObject Object (
我一直在寻找一种方法来实现 ArrayObject 类来存储应用程序配置,我在 php 手册(评论之一)中找到了这个实现 setFlags(ArrayObject::ARRAY_AS_PROPS);
我正在尝试访问公共(public)函数 get_data(),以生成“此处”的输出,以查看是否从对象数组创建动态对象..那么我该怎么做。 #include #include using namesp
我正在做 FRVT 1:1 验证。所以我需要使用FRVT提供的程序。我已经连接到我编写的程序,并完成了实现。 但是我想把我用cython写的东西一步步移植到NullImp FRVT 提供的示例。但我得
这个问题已经有答案了: Type safety: Unchecked cast (10 个回答) 已关闭 7 年前。 我该如何解决这个警告? Type safety: Unchecked cast f
如标题所述,如何在 arrayObject 上执行 array_unshift(),array_push() 是通过执行arrayObject->append() 但是 unshift 呢? 编辑:我
问题:我正在尝试扩展 PHP 的 ArrayObject,如下所示。不幸的是,在设置多维对象时我无法让它正常工作,而是抛出了一个错误,因为我在 PHP 中启用了严格设置。 (错误:严格标准:从空值创建
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我在 ArrayObject 中寻找 __destroy() 方法,但没有找到实现。如果我将包含 ArrayObject 的变量设置为 NULL,它会正确地销毁存储在其中的所有对象并释放内存吗?或者我
我不知道如何使用 SwiftyJSON.JSON 制作数组我可以使用 SwiftyJSON.JSON 解析结构,但无法解析对象数组。请帮助我。 JSON { "result": { "li
我发现很多类似的问题,人们对这个文件有疑问。我知道头文件在哪里,我用 -I 解决 g++,因为人们通常会回答前面的问题。我做了所有这些,但他们没有工作。 1 , 2 sum_array_wrap.cp
我是一名优秀的程序员,十分优秀!