resetとループ
http://php.net/manual/ja/control-structures.foreach.php:foreachのマニュアルには
foreachの実行開始時に内部配列ポインタは、 配列の先頭要素を指すように自動的にリセットされます。 このため、foreachループの前に reset()をコールする必要はありません。
と書いてある。
どういう感じか目でみるためにまずはreset関数についてためし
resettest.php
<?php // 適当に配列作る $sample_array = array(); foreach ( range(1,3) as $num ){ $sample_array["key$num"] = "val$num"; } // 無駄に回す foreach ( $sample_array as $k1 => $v1 ){ print $k1 . ' : ' . $v1 . "\n"; } print "----\n"; // 無駄に回す while ( list($k2, $v2) = each($sample_array) ){ print $k2 . ' : ' . $v2 . "\n"; } print "----\n"; // 無駄に回す foreach ( $sample_array as $k3 => $v3 ){ print $k3 . ' : ' . $v3 . "\n"; } ?>
出力
# php eachtest.php key1 : val1 key2 : val2 key3 : val3 ---- ---- key1 : val1 key2 : val2 key3 : val3
なるほど、whileはポインタが戻らず出力されない
whileの前でreset($sample_array)すると出力されるようになります
each、next、current
reset関連で、ポインタを移動する関数たちを使ってみるテスト
<?php // 適当に配列作る $sample_array = array(); foreach ( range(1,3) as $num ){ $sample_array["key$num"] = "val$num"; } print(print_r($sample_array,1)); // current関数の戻り値を出力 $v1 = current($sample_array); print "v1 : " . $v1 . "\n"; // next関数の戻り値を出力 $v2 = next($sample_array); print "v2 : " . $v2 . "\n"; // 再度current関数の戻り値を出力 $v3 = current($sample_array); print "v3 : " . $v3 . "\n"; // each関数の戻り値を出力 list($key, $val) = each($sample_array); print $key . ": " . $val . "\n"; // 再度current関数の戻り値を出力 $v4 = current($sample_array); print "v4 : " . $v4 . "\n"; ?>
出力
# php pointertest.php [~/phptest 20:13] Array ( [key1] => val1 [key2] => val2 [key3] => val3 ) v1 : val1 v2 : val2 v3 : val2 key2: val2 v4 : val3
current…現在のポインタの値を返却
next…ポインタを次に動かしてから、currentポインタの値を返却
each…currentポインタの値を返却してから、ポインタを次に移動
のような感じですね