gpt4 book ai didi

php - 在 PHP 中从迭代器中删除元素

转载 作者:行者123 更新时间:2023-12-05 07:57:36 26 4
gpt4 key购买 nike

我正在处理一个实现了 ArrayAccess AND Iterator 的类(比方说 $a)和,在使用 foreach 循环遍历它时,我想删除/取消设置一些元素(基于某些 if 条件)。

foreach($a as $item) {
if(mustBeRemoved()) {
$a->remove($item);
}
}

现在,我的实现中的问题是,这会在 foreach 循环中引发意外行为,导致它不会意识到更改,并且会继续运行并过早停止,而不管元素是否已删除(或添加)。

有没有好的/优雅的方法来解决这个问题?

最佳答案

当我实现一个实现 Iterator 和 ArrayAccess 用于测试目的的类时,我没有遇到你的问题:

<?php
class a implements Iterator, ArrayAccess {
public $items = array();
private $index = 0;

public function current() {
return $this->items[$this->index];
}

public function key() {
return $this->index;
}

public function next() {
++$this->index;
}

public function rewind() {
$this->index = 0;
}

public function valid() {
return array_key_exists($this->index, $this->items);
}

public function offsetExists($offset) {
return array_key_exists($offset, $this->items);
}

public function offsetGet($offset) {
return $this->items[$offset];
}

public function offsetSet($offset, $value) {
$this->items[$offset] = $value;
}

public function offsetUnset($offset) {
unset($this->items[$offset]);
}

public function remove($item) {
foreach($this->items as $index => $itemsItem) {
if( $itemsItem == $item) {
unset($this->items[$index]);
break;
}
}
}
}

$a = new a();
array_map(array($a, 'offsetSet'), range(0, 100), range(0, 100));

foreach($a as $item) {
if( $item % 2 === 0 ) {
$a->remove($item);
}
}

var_dump($a->items);

如果您实现了迭代器,请更改它以确保在调用“下一个”和“当前”时删除一个项目不会使“a”实例返回不同的项目。

否则,你可以试试这个:

$mustBeRemoved = array();
foreach($a as $item) {
if(mustBeRemoved()) {
$mustBeRemoved []= $item;
}
}
foreach($mustBeRemoved as $item) {
$a->remove($item);
}
unset($mustBeRemoved);

关于php - 在 PHP 中从迭代器中删除元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26486194/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com