ジェネレータを作ったり遅延評価するのが流行っているようなので、PHP5.5.0から導入されたジェネレータを使って同様のことをPHPでもやってみようと思いました。
これまでの流れ
PHPのイテレータ、ジェネレータ
PHP 5 は、foreach のような反復処理を可能とするよう オブジェクトを定義する手段を提供しており、IteratorやIteratorAggregateなどを実装することによってオブジェクトの反復処理の方法などを細かく指定することができます.
遅延評価
PHP で yield を使ったジェネレータを作成すると遅延評価されていることはこれまでの例から分かることと思います. イテレータを引数にとってイテレータを返す関数を利用することで, より複雑な処理を行うことができます. このようなイテレータを生成する関数はPHP には標準では存在しません. (lstrojny/functional-php · GitHubやnikic/iter · GitHubのような外部ライブラリは存在しますが…)
それらの関数を模倣してみます.
実際の例は以下
PHPではデフォルトではリストを受け取ってリストを返すarray_map() やarray_fileter() などは存在しますが、イテレータを受け取ってイテレータを返すようなmap, filter などが存在しないので3~27行目で独自に簡易的に実装しています.