ところで、連載第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);
実行結果は下記の通りです。なお、乱数を使用するので、実行結果は毎回変わってきます。
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に値が格納されます。
ジェネレータの解説の最後に、ジェネレータ関数内で他のジェネレータ関数を呼び出す方法を紹介します。これはジェネレータの「委譲」と呼ばれます。例で見ていきましょう。下記の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>"); }
実行結果は下記の通りです。
性別 男 女 職業 会社員 自営業 無職
実行部分(23行目以降)では、categoryGenerator()ジェネレータ関数の実行結果をループさせながらyieldされた値を単に表示させているだけです。その実行結果からyieldの順序というのは、4行目→12行目→13行目→6行目→18行目→19行目→20行目となっています。つまり、categoryGenerator()の途中でgenderGenerator()とjobGenerator()が都度呼び出されています。
それを実現しているのが5行目と7行目です。ここでの記述は、まとめると下記のようになります。
yield from ジェネレータ関数
このように記述することで、yieldする値を他のジェネレータ関数に任せることができます。これをジェネレータの委譲といいます。ただし、委譲先ジェネレータ関数で、全てのyieldが終了しなければ元のジェネレータ関数に処理は戻りませんの注意してください。
次回はPHPのオブジェクト指向構文を扱います。
Copyright © ITmedia, Inc. All Rights Reserved.