1

私はコードの一部を理解しようとしています:

$array = array('koala', 'kangaroo', 'wombat', 'wallaby', 'emu', 'kiwi', 'kookaburra', 'platypus');
$object = new ArrayIterator($array);
foreach($object as $key=>$value)
{
if($object->offSetGet($key) === 'kiwi')
{
$object->offSetUnset($key);
}
echo $key.' - '.$value."<br />";
}

私が理解しようとしていたのは、offSetUnsetが最初の要素ではなく配列の2番目の要素へのポインターを取得している理由です。私の理論は、次の一連のイベントです。

offSetUnsetが要素0へのポインタgoeと呼ばれると、offSetUnsetはforeachが要素を要求するまで待機し、offSetUnsetはそれが動作できることを認識します。したがって、それが発生すると、前に指定された要素が削除されます。反復が終了すると、次の要素とそれが、offSetUnsetがforeachループをリセットした後に0要素を失うと思う理由です。

しかし、私がここで尋ねる前に思いついた唯一の理論を言ったので、誰かが私を連れて行ってくれるなら、イベントシーケンスを通して私たちを0要素を失いました。ありがとうございました。良い一日を。

4

2 に答える 2

2

あなたが見つけたバグに非常に「近い」ように聞こえる文書化されたバグがあります!
これを回避するには、次のようにします。

$array = array('koala', 'kangaroo', 'wombat', 'wallaby', 'emu', 'kiwi', 'kookaburra', 'platypus');
$object = new ArrayIterator($array);
for ( $object->rewind(); $object->valid(); $object->next() )
{
    if($object->current() === 'kiwi')
    {
        $object->offsetUnset( $object->key() );
    }
    echo $object->key().' - '.$object->offsetGet($object->key())."\n";
}

出力:

0 - koala
1 - kangaroo
2 - wombat
3 - wallaby
4 - emu
0 - koala  (this time it starts over from the first element!)
1 - kangaroo
2 - wombat
3 - wallaby
4 - emu
6 - kookaburra
7 - platypus

必要に応じてバグを送信できますが、バグについて私が見た他のスレッドによると、ArrayIteratorすぐに修正されるとは信じがたいです...

于 2012-09-13T18:08:23.150 に答える
2

次に、offsetUnsetを使用します。ここで、要素はインデックスによって設定解除され、期待される結果が得られます。

$array = array('koala', 'kangaroo', 'wombat', 'wallaby', 'emu', 'kiwi', 'kookaburra', 'platypus');

$object = new \ArrayIterator($array);

foreach ($object->getArrayCopy() as $i => $item) {
    if($item === 'kiwi') {
        $object->offsetUnset( $i );
    }
}

print_r($object->getArrayCopy());

出力:

Array ( [0] => koala [1] => kangaroo [2] => wombat [3] => wallaby [4] => emu [6] => kookaburra [7] => platypus )
于 2017-03-02T11:47:11.840 に答える