Php 无法从ArrayObject中删除元素
我有一个扩展ArrayObject的简单类。看起来是这样的:Php 无法从ArrayObject中删除元素,php,Php,我有一个扩展ArrayObject的简单类。看起来是这样的: class SimpleCollection extends ArrayObject { public function __construct($arr = []) { parent::__construct($arr, ArrayObject::ARRAY_AS_PROPS); } public function contains($value) {
class SimpleCollection extends ArrayObject
{
public function __construct($arr = [])
{
parent::__construct($arr, ArrayObject::ARRAY_AS_PROPS);
}
public function contains($value)
{
return in_array($value, $this->getArrayCopy());
}
public function remove($vertex)
{
unset($this[$vertex]);
}
}
它的构造函数和包含了预期的方法工作。但是remove
方法不起作用:
$arr = new SimpleCollection(['b']);
$arr->remove('b');
echo $arr->contains('b');
最后一个命令打印true
,即使我试图从对象中删除元素。这有什么问题,我如何修复它?正如我在文章中提到的,它在unset()
函数中抛出一个错误,因为没有定义索引b
。如果我们看看var\u dump($arr)
,这是有道理的:
object(SimpleCollection)#1 (1) {
["storage":"ArrayObject":private] => array(1) {
[0]=> string(1) "b"
}
}
当您执行$arr=newsimpleCollection(['b'])
它不生成b
索引,而是生成b
索引为0
的值
这也是有意义的,因为['b']
是
array(1) {
[0]=> string(1) "b"
}
要获得所需的结果,您必须将['b']
更改为类似['b'=>'something']
的内容。然后,remove()
函数将起作用。顺便说一句,如果有更好的方法来检查我的简单集合是否包含元素(不构建数组的副本),最好知道。请提供$this->getArrayCopy()的代码
getArrayCopy
是在ArrayObject
中实现的方法。它不是自定义方法。是否启用了错误报告?因为在执行代码时,它会在b
的unset()
处抛出一个错误(E\u注意:键入8——未定义索引:b
),这意味着您在尝试取消设置b
索引时没有访问实际的ArrayObject。@Tom Udding。我没有那样做。但从结果来看,这种结构不起作用。