PHP Conference Japan 2024

ArrayIterator::offsetUnset

(PHP 5, PHP 7, PHP 8)

ArrayIterator::offsetUnset取消设置偏移量的值

描述

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

取消设置偏移量的值。

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

参数

key

要取消设置的偏移量。

返回值

不返回值。

参见

添加注释

用户贡献的注释 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() );
/*** ... ***/
?>

这将产生正确的结果
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);
?>
Adil Baig @ AIdezigns
13 年前
确保使用此函数取消设置值。不能将此迭代器的值作为数组访问。例如

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

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

将返回

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

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