イテレータに対して何かする関数があったので使ってみる。
正直count()のデフォルトがiterator_count()でいい気がするのですがどうでしょう。
iterator_apply()はイテレータの全要素に対してユーザ関数を適用するというもので、array_walk()と似たようなものです。
ただなんか与える引数がめんどくさいんですよね。
ノートにも書かれていますが、第一引数のイテレータはループに使うだけで中身は無視されます。
単純に第三引数をなくして第一引数にするとかでは駄目だったのでしょうか。
<?php
// 適当なサンプル
Class Sample implements IteratorAggregate{
private $hide = array( 'hide1', 'hide2' );
private $show = array( 'show1', 'show2' );
/**
* @Override
* イテレータを取得する
* @return ArrayIterator $this->showのイテレータ
*/
public function getIterator(){
return new ArrayIterator($this->show);
}
}
$sample = new Sample();
// イテレータから配列にする array ( 0 => 'show1', 1 => 'show2' )
$array = iterator_to_array($sample);
var_export($array);
// これと同じ
$array = array();
foreach($sample as $key=>$val){
$array[$key] = $val;
}
// オブジェクトのカウントはCountableを実装しないと正しくない →1になる
print(count($sample));
// 要素数を正しく取得できる →2
print(iterator_count($sample));
// 全要素でcallbackFunctionをコール…のつもりだったのだが何故か両方ともshow1になる
iterator_apply($sample->getIterator(), 'callbackFunction', array($sample->getIterator()));
// 一度イテレータを変数に取り出さないと何故かうまく動かない
$iterator = $sample->getIterator();
iterator_apply($iterator, 'callbackFunction', array($iterator));
/**
* イテレータの現在値をprintするだけ。
* @param Iterator イテレータ
* @return boolean true
*/
function callbackFunction(Iterator $value){
print($value->current());
return true;
}
iterator_to_array()はイテレータから配列に変換する、iterator_count()はイテレータの要素数を数えるという関数です。正直count()のデフォルトがiterator_count()でいい気がするのですがどうでしょう。
iterator_apply()はイテレータの全要素に対してユーザ関数を適用するというもので、array_walk()と似たようなものです。
ただなんか与える引数がめんどくさいんですよね。
ノートにも書かれていますが、第一引数のイテレータはループに使うだけで中身は無視されます。
単純に第三引数をなくして第一引数にするとかでは駄目だったのでしょうか。
PR