[ PHP ] バカが使うと火傷するSPLイテレータ(LimitIterator InfiniteIterator)

Pocket

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

参考

スポンサーリンク


Pocket

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>