ArrayIterator::offsetUnset

(PHP 5, PHP 7, PHP 8)

ArrayIterator::offsetUnset取消偏移量的值

描述

public ArrayIterator::offsetUnset(混合 $key):

取消偏移量的值。

如果迭代正在进行,并且使用 ArrayIterator::offsetUnset() 取消迭代的当前索引,迭代位置将前进到下一个索引。由于迭代位置在 foreach 循环体结束时也会前进,因此在 foreach 循环内部使用 ArrayIterator::offsetUnset() 可能会导致跳过索引。

参数

key

要取消的偏移量。

返回值

不返回值。

参见

添加备注

用户贡献的备注 3 个备注

3
olav at fwt dot no
13 年前
在处理过程中取消设置元素时,它不会删除正在处理的数组的第二个索引。我不确定确切的原因,但有一些推测说,当调用 unsetOffset(); 时,它也会重置指针。

<?php

$a
= new ArrayObject( range( 0,9 ) );
$b = new ArrayIterator( $a );

for (
$b->rewind(); $b->valid(); $b->next() )
{
echo
"#{$b->key()} - {$b->current()} - \r\n";
$b->offsetUnset( $b->key() );
}

?>

为了避免此错误,您可以在 for 循环中调用 offsetUnset

<?php
/*** ... ***/
for ( $b->rewind(); $b->valid(); $b->offsetUnset( $b->key() ) )
{
/*** ... ***/
?>

或者直接在 ArrayObject 中取消设置它
<?php
/*** ... ***/
$a->offsetUnset( $b->key() );
/*** ... ***/
?>

这将产生正确的结果
2
rkos...
10 年前
这是我针对 offsetUnset 问题的解决方案
<?php

$a
= new ArrayObject( range( 0,9 ) );
$b = new ArrayIterator( $a );

for (
$b->rewind(); $b->valid(); )
{
echo
"#{$b->key()} - {$b->current()} - <br>\r\n";
if(
$b->key()==0 || $b->key()==1){
$b->offsetUnset( $b->key() );
}else {
$b->next();
}
}

var_dump($b);
?>
0
Adil Baig @ AIdezigns
13 年前
确保您使用此函数取消设置值。您不能将此迭代器的值作为数组访问。例如

<?php
$iterator
= new \RecursiveIteratorIterator(new \RecursiveArrayIterator($arr));

foreach(
$iterator as $key => $value)
{
unset(
$iterator[$key]);
}
?>

将返回

PHP 致命错误:无法将 RecursiveIteratorIterator 类型的对象用作数组

即使从嵌套数组中删除项目,offsetUnset 也能正常工作。
To Top