ところで、連載第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のオブジェクト指向構文を扱います。
WordPress活用に欠かせない、PHPをWindowsにダウンロードしてインストール、アンインストールする
PHPにおけるクラスの書き方と呼び出し方――インスタンス、メソッド、プロパティ
PHP(スクリプト言語)Copyright © ITmedia, Inc. All Rights Reserved.