ここでは、Standard PHP Library (SPL) イテレータの LimitIterator および InfiniteIterator イテレータのサンプルコードを掲載しています。
なお、火傷したバカは私です。実際のところ、バカが使っても火傷はしません(^^)が、きっと目が回ります(~~)。
スポンサーリンク
1.繰り返し処理を行う位置を制限する LimitIterator
LimitIterator は繰り返し処理を行う位置を制限するために使用されます。詳細は以下のサンプル内のコメントを確認ください。
$results = new ArrayIterator(
array(
'国語' => 70,
'算数' => 50,
'理科' => 60,
'社会' => 80,
));
/*
* 繰り返し位置を制限して、繰り返し処理を行う
*/
// 最初の2つ(国語、算数)の成績のみ出力する
foreach (new LimitIterator($results, 0, 2) as $subject => $point) {
var_dump($point);
}
// 出力結果
//--------------------------------
// int 70
// int 50
// 3つ目以降(理科、社会)の成績のみ出力する
foreach (new LimitIterator($results, 2) as $subject => $point) {
var_dump($point);
}
// 出力結果
//--------------------------------
// int 60
// int 80
2.無限ループに注意が必要 InfiniteIterator
InfiniteIterator イテレータは繰り返し処理対象の最後まで行われると、最初から再度繰り返し処理 行われます。グルグルグルグルな無限ループに注意が必要です。目が回ります。
$results = new ArrayIterator(
array(
'国語' => 70,
'算数' => 50,
'理科' => 60,
'社会' => 80,
));
$limit = 10;
$loop = 0;
// ひたすら繰り返し処理を行う
foreach (new InfiniteIterator($results) as $subject => $point) {
var_dump($point);
// 無限ループの回避
if($limit === ++$loop) { break; }
}
// 出力結果
//--------------------------------
// int 70
// int 50
// int 60
// int 80
// int 70
// int 50
// int 60
// int 80
// int 70
// int 50
3.LimitIterator と InfiniteIterator を組み合わせて使う
フュージョンです。何でも合体するとパワーアップします。
$results = new ArrayIterator(
array(
'国語' => 70,
'算数' => 50,
'理科' => 60,
'社会' => 80,
));
$limit = 10; // 無限ループ脱出回数
$loop = 0; // ループカウンター
foreach (new InfiniteIterator(new LimitIterator($results, 0, 2)) as $subject => $point) {
var_dump($point);
// 無限ループの回避
if($limit === ++$loop) { break; }
}
// 最初の2科目(国語、算数)のみに対して、無限に繰り返し処理が実行されることがわかる
// 出力結果
//--------------------------------
// int 70
// int 50
// int 70
// int 50
// int 70
// int 50
// int 70
// int 50
// int 70
// int 50
foreach (new LimitIterator(new InfiniteIterator($results), 0, 2) as $subject => $point) {
var_dump($point);
}
// LimitIterator の制限で最初の2科目分のみ繰り返し処理が行われる
// InfiniteIterator の影響は受けない
//
// 出力結果
//--------------------------------
// int 70
// int 50