2012-05-08 51 views
22

ArrayIteratorArrayObjectとArrayの基本的な違いを機能と操作の面で明確に説明できますか?ありがとう!PHPのArrayIterator、ArrayObject、Arrayの違い

+3

[ArrayIterator](http://www.php.net/ArrayIterator)、[ArrayObject](http://www.php.net/ArrayObject)、[Array](http:// www。 php.net/Array)?それはおそらくあなたが必要とするすべての情報です。 – vascowhite

+1

また、[Stackoverflowはあなたの個人研究のアシスタントではありません](http://meta.stackexchange.com/a/128553/164367) – vascowhite

答えて

0

は、あなたがここにあなたの答えを見つけることがある:

  • The ArrayIterator class
    • このイテレータは、設定を解除することができますし、 は配列とオブジェクトを反復処理しながら、値とキーを変更します。

      あなたはArrayObjectをインスタンス化し、それがforeachのを使用するか、手動でその getIterator()メソッドを呼び出すことにより、どちらかそれを参照 ArrayIteratorのインスタンスを作成できるようにする を必要と同じ配列を複数回反復処理したいです。

    も読み:

    +12

    申し訳ありませんが私の質問を明確にしていない - はい、私は彼らがほとんど同じことをするように思える。私は、誰かが実際の違いが彼らと他の人とを選択する理由を説明できるかどうか疑問に思っていました。これは、ここに掲載するのに適した質問ではない場合、私は謝罪し、この記事を削除して自由に感じてください! – jkhamler

    19

    Arrayは、ネイティブなPHPの型です。あなたはarray()を構築するPHP言語を使用して作成することができ、またはPHP 5.4のよう以降[]

    ArrayObjectは正確に配列のように動作しobjectです。これらは、newキーワード

    を使用して作成することができます。ArrayObjectと同じですが、それ自体は繰り返し処理が可能です。また、彼らの両方が、例えばのために、PHPの配列構文を使用して使用することができますArrayArrayObject/ArrayIterator)VS

    を比較new


    を使用して作成しました。

    $array[] = 'foo'; 
    $object[] = 'foo'; 
    // adds new element with the expected numeric key 
    
    $array['bar'] = 'foo'; 
    $object['bar'] = 'foo'; 
    // adds new element with the key "bar" 
    
    foreach($array as $value); 
    foreach($object as $value); 
    // iterating over the elements 
    

    あなたは

    is_array($array); // true 
    is_array($object); // false 
    
    is_object($array); // false 
    is_object($object); // true 
    

    の違いは、PHPの配列関数のほとんどがそうでエラーがスローうオブジェクトを使用して、配列を期待気付くだろうので、しかし、彼らはまだ、配列対オブジェクトです。そのような機能はたくさんあります。たとえば。

    sort($array); // works as expected 
    sort($object); // Warning: sort() expects parameter 1 to be array, object given in ...... 
    

    最後に、オブジェクトがすなわちオブジェクト構文

    $object->foo = 'bar'; // works 
    $array->foo = 'bar'; // Warning: Attempt to assign property of non-object in .... 
    

    アレイ(ネイティブ型であること)を使用して、パブリックプロパティにアクセスする、あなたはstdClassオブジェクトから期待何ができるオブジェクトよりもはるかに高速です。ArrayIterator

    これらの2の主な違いは対ArrayObjectを比較すると、配列


    にはそのようなものは存在しない間に、他の側では、ArrayObject & ArrayIteratorクラスは、特定の方法は、あなたが使用できることを定義していますクラスが持つメソッドにあります。

    ArrayIteratorは、要素の反復/ループに関連するメソッドを提供するIteratorインターフェイスを実装しています。 ArrayObjectにはexchangeArrayというメソッドがあり、内部の配列と別の配列を入れ替えます。 ArrayIteratorに同様のことを実装することは、新しいオブジェクトを作成するか、またはキーをループすることを意味します。& unsetすべて1つずつ&新しい配列から要素を1つずつ設定します。

    次に、ArrayObjectは反復できないため、foreachで使用すると、ArrayIteratorオブジェクトが内部的に作成されます(配列と同じです)。これは、PHPが元のデータのコピーを作成することを意味します&今、同じ内容の2つのオブジェクトがあります。これは、大規模な配列では効率が悪いことがわかります。ただし、イテレータに使用するクラスを指定できるため、コードにカスタムイテレータを含めることができます。


    希望します。この回答の編集は大歓迎です。

    +0

    説明はarrayIteratorがすべて間違っていることです。私の答えを読んでください。 – David

    7

    ArrayObjectと配列は多少似ています。単にオブジェクト(またはネイティブタイプ)のコレクション。彼らはあなたが呼ぶことができるいくつかの異なる方法を持っていますが、それは主に同じことにまで沸きます。

    しかし、Iteratorは完全に別のものです。イテレーターのデザインパターンは、配列を安全にするための方法です(読み取り可能にするだけです)。次の例を考えてみましょう:

    あなたは配列を持つクラスがあります。 addSomethingToMyArrayを使用して、その配列に項目を追加できます。ただし、配列に実際に追加する前に、何かを行うことに注意してください。これは何でもかまいませんが、配列に追加したいすべてのアイテムに対してこのメ​​ソッドが起動されることが非常に重要であるように、一時的な動作を可能にします。

    class A 
    { 
        private $myArray; 
        public function returnMyArray() 
        { 
         return $this->myArray; 
        } 
    
        public function addSomethingToMyArray($item) 
        { 
         $this->doSomethingToItem($item); 
         array_push($item); 
        } 
    } 
    

    この問題は、ここで参照によって配列を渡すことです。つまり、実際にreturnMyArrayを使用するクラスは、実際のmyArrayオブジェクトを取得します。これは、A以外のクラスがその配列に物を追加できることを意味します。そのため、addSOmethingToMyArrayを使用せずに、配列をA内で変更することもできます。しかし、我々はSOmethingToItemをする必要があった、覚えている?これは、自身の内部状態を制御していないクラスの例です。

    これに対する解決策はイテレータです。配列を渡す代わりに、新しいオブジェクトに配列を渡します。新しいオブジェクトは、配列から読み込むことしかできません。最も単純なイテレータは、次のようなものです:

    <?php 
    
    class MyIterator{ 
    
        private $array; 
        private $index; 
    
        public function __construct($array) 
        { 
         $this->array = $array; 
        } 
    
        public function hasNext() 
        { 
         return count($this->array) > $this->index; 
        } 
    
        public function next() 
        { 
         $item = $this->array[ $this->index ]; 
         this->$index++; 
    
         return $item; 
        }  
    } 
    

    ?さて、再び唯一の方法があります

    while($iterator->hasNext()) 
        $item = $iterator->next(); 
    

    :あなたが見ることができるように>

    、私は与えられた配列に新しいアイテムを追加する方法はありません、しかし、私はこのような配列を読み取ることposibilitiesを持っていますaddSomethingToArrayメソッドを使用して、AでmyArrayに項目を追加します。つまり、イテレータは、カプセル化と呼ばれるものを提供するために、配列の周りのシェルのようなものです。

    0

    arrayは、PHPの8つのプリミティブ型の1つです。それには、多くの組み込みのユーティリティ関数が付属していますが、すべて手続き型です。

    ArrayObjectArrayIteratorはどちらも、オブジェクト指向プログラム(OOP)で配列第一級市民を作ることができます。 ArrayObjectArrayIterator

    違いはArrayIteratorSeekableIteratorインタフェースを実装しているので、あなたがArrayIterator$myArray->seek(10);を行うことができます、ということです。

    0

    Iteratorは、プログラマーがコンテナ、特にリストをトラバースできるようにするオブジェクトです。さまざまなタイプのイテレータが、しばしばコンテナのインタフェースを介して提供されます。

    ArrayObjectArrayは、異なるオブジェクトタイプを使用していても同じことを表しているため、大きな違いはありません。

    ArrayIteratorArray-likeオブジェクトを反復、これはArrayAcessを実装するすべてのオブジェクトとネイティブArrayタイプを含むことがイテレータです。あなたが見ることができます配列を超えるforeach、PHPは内部的に、これを入力したかのように見えるようにトラバースを行うと、あなたのコードを変換するために

    for($arrayIterator->rewind(); $arrayIterator->valid(); $arrayIterator- 
    >next()) 
    { $key = $arrayIteartor->key(); 
        $value = $arrayIterator->current(); 
    } 
    

    ArrayIteratorを作成しますので、すべてのコレクションオブジェクトは、以外のIteratorを持って実際に 、独自のイテレータを定義するために必要な定義済みのコレクション