忍者ブログ
[PR]
×

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



2024/03/29 23:35 |
PHP1-37:PHPでイテレータ

配列やそれに類似するデータ構造の各要素に対する繰返し処理の抽象化である
といわれても何のことだかさっぱりです。

PHPでは、配列にアクセスする際はforeachなりnextなりを使用し、
ディレクトリにアクセスする際はopendirやreaddirを使用し、
XMLを解析する場合はxml_set_element_handlerなりxml_set_character_data_handlerを使用したりするわけですが、これでは処理する相手が増えるたびに新しい関数を覚えなくてはいけなかったりして恐ろしく面倒です。

というわけでIteratorパターンなるものが編み出されました。
データ構造からデータを取得する手段を切り離すということです。

これを使用することによって、$iterator_array->next()で配列の次の値を取得し、$iterator_dir->next()で次のファイル名を取得し、$iterator_xml->next()でXMLの次の要素を取得できるようになるわけです。
とりあえず配列について簡単にIteratorを作成してみます。
例によってエラー処理は放置。

iterator_array.php 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<?php
    class Iterator_array{
        
        public $array=array(
            '',
            '<',
            '&lt;',
            '!"#%&',
            '\''
        );
        
        function __construct(){
            $this->position=0;
        }
        
        public function current(){
            return $this->array[$this->position];
        }
        public function key(){
            return $this->position;
        }
        
        public function next(){
            $this->position++;
        }
        
        public function rewind(){
            $this->position=0;
        }
        
        public function seek($position){
            $this->position=$position;
        }
        
        public function valid(){
            return isset($this->array[$this->position]) ? true : false;
        }
        
        public function count(){
            return count($this->array);
        }
    
    #↓クラスのおわり
    }

index.php
1
2
3
4
5
6
7
8
9
10
<?php
    
    require_once('iterator.php');
    $iter=new Iterator_array();
    
    print($iter->current());
    $iter->next();
    print($iter->current());
    $iter->seek(4);
    print($iter->current());

さて、PHP5においてクラス関連機能が強化されたことに伴い、このように統一した操作を行うIteratorインターフェイスが用意されました。
せっかく自力でIterator_arrayクラスを作成したのに、内容のほぼ同じArrayIterator が実装されて俺涙目。
PR


2008/12/08 19:19 | Comments(0) | TrackBack() | PHP

トラックバック

トラックバックURL:

コメント

コメントを投稿する






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



<<PHP1-38:オブジェクトでイテレータ | HOME | JavaScript2-6:jQueryその1>>
忍者ブログ[PR]