tweeeetyのぶろぐ的めも

アウトプットが少なかったダメな自分をアウトプット<br>\(^o^)/

reset関数とforeachとwhile(list=each)。ついでにeachやnextやらcurrentやら

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ポインタの値を返却してから、ポインタを次に移動
のような感じですね