ここでは、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