PHPのジェネレータ――foreachループで使える値生成のための関数Web業界で働くためのPHP入門(12)(3/3 ページ)

» 2017年10月30日 05時00分 公開
前のページへ 1|2|3       

キーと値のyield

 ところで、連載第5回「PHPの配列変数、array、キー、多次元配列&var_dump」で、「PHPの配列はキーと値のペアで成り立っている」と述べました。実は、ジェネレータ関数で値を生成する際、キーと値のペアをyieldできます。例で見てみましょう。リスト7を改造した下記のuseRandGenerator2.phpを作成し、実行してください。

<?php
function randGenerator($count)
{
    for($i = 1; $i <= $count; $i++) {
        yield $i => rand(1, 10);
    }
}
 
$sum = 0;
foreach(randGenerator(10) as $num => $value) {
    print($num."個目の乱数: ".$value."<br>");
    $sum += $value;
}
print("乱数の合計: ".$sum);
リスト8 phplesson/chap12/useRandGenerator2.php

 実行結果は下記の通りです。なお、乱数を使用するので、実行結果は毎回変わってきます。

1個目の乱数: 5
2個目の乱数: 4
3個目の乱数: 3
4個目の乱数: 2
5個目の乱数: 5
6個目の乱数: 2
7個目の乱数: 7
8個目の乱数: 2
9個目の乱数: 7
10個目の乱数: 3
乱数の合計: 40

 ここでのポイントは5行目です。下記の記述で、キーと値のペアをyieldできます。

yield キー => 値;

 10行目でrandGenerator()で生成されたジェネレータをforeachでループしていますが、as以降が下記の記述になっています。

$num => $value

 この$numにキーが、$valueに値が格納されます。

yield from――ジェネレータ関数内で他のジェネレータ関数を呼び出す

 ジェネレータの解説の最後に、ジェネレータ関数内で他のジェネレータ関数を呼び出す方法を紹介します。これはジェネレータの「委譲」と呼ばれます。例で見ていきましょう。下記のuseYieldFrom.phpを作成し、実行してください。

<?php
function categoryGenerator()
{
    yield "性別";
    yield from genderGenerator();
    yield "職業";
    yield from jobGenerator();
}
 
function genderGenerator()
{
    yield "男";
    yield "女";
}
 
function jobGenerator()
{
    yield "会社員";
    yield "自営業";
    yield "無職";
}
 
foreach(categoryGenerator() as $value) {
    print($value."<br>");
}
リスト9 phplesson/chap12/useYieldFrom.php

 実行結果は下記の通りです。

性別
男
女
職業
会社員
自営業
無職

 実行部分(23行目以降)では、categoryGenerator()ジェネレータ関数の実行結果をループさせながらyieldされた値を単に表示させているだけです。その実行結果からyieldの順序というのは、4行目→12行目→13行目→6行目→18行目→19行目→20行目となっています。つまり、categoryGenerator()の途中でgenderGenerator()とjobGenerator()が都度呼び出されています。

図6 リスト9の処理の流れ(丸数字はyieldの順番)

 それを実現しているのが5行目と7行目です。ここでの記述は、まとめると下記のようになります。

yield from ジェネレータ関数

 このように記述することで、yieldする値を他のジェネレータ関数に任せることができます。これをジェネレータの委譲といいます。ただし、委譲先ジェネレータ関数で、全てのyieldが終了しなければ元のジェネレータ関数に処理は戻りませんの注意してください。

次回はオブジェクト指向構文

 次回はPHPのオブジェクト指向構文を扱います。

今回のサンプルコード

 今回のサンプルコードはこちらからダウンロードできます。

前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。