忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2017/05/01 15:14 |
PHP5.4.4 イテレータ関数
イテレータに対して何かする関数があったので使ってみる。
<?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


2013/03/27 22:34 | Comments(0) | PHP

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<今週の実績 2013/03/31 | HOME | Minecraft1.4.7 Applied Energistics RV.9F その1 クォーツ>>
忍者ブログ[PR]