2
<?php
$a = array(1, 2, 3, 4, 5);
foreach ($a as $key => $elem) {
    echo "$key = $elem"; echo ' = ';
    var_dump(current($a));\
}
?>

実行時に得られる出力は次のとおりです。

0 = 1 = int(2)

1 = 2 = int(2)

2 = 3 = int(2)

3 = 4 = int(2)

4 = 5 = int(2)

これは私が得るべき出力だと思いますか?:

0 = 1 = int(1)

1 = 2 = int(2)

2 = 3 = int(3)

3 = 4 = int(4)

4 = 5 = int(5)

$a の for ループの前に current() を実行し、int(1) を取得します。したがって、インクリメントを引き起こしているのは foreach ループのようです。しかし、もしそうなら、なぜそれを一度だけ行うのですか?

for ループで next() を呼び出すと、インクリメントされますが、それ以外の場合はインクリメントされません。もちろん、next() は int(3) (つまり、int(2) の後の値) から始まります。

4

3 に答える 3

1

現在のPHPドキュメントを読むと、foreachが現在のポインターを移動することを期待する必要があるようには見えません。

参照してください: http://php.net/manual/en/function.current.php

少し紛らわしいのは、各関数が現在のポインターを移動することです。したがって、配列を foreach ではなく each を使用してループとして書き直すと、現在の目的の動作が得られます。

each() で書き直した例を次に示します。これにより、期待される結果が得られます。

<?php
$a = array(1, 2, 3, 4, 5);
while ( list($key,$elem) = each($a)) {
    echo "$key = $elem"; echo ' = ';
    var_dump(current($a));
}
?>
于 2012-12-12T13:39:31.693 に答える
0

current()内部フラグ (ポインター) を使用し、foreach は独自のものを使用します。

これを行いたい場合 ($key にキーがあるので、これはばかげています)、ArrayIteratorを使用できます。

于 2012-12-12T13:37:53.407 に答える