ArrayIterator
とArrayObject
とArrayの基本的な違いを機能と操作の面で明確に説明できますか?ありがとう!PHPのArrayIterator、ArrayObject、Arrayの違い
答えて
は、あなたがここにあなたの答えを見つけることがある:
このイテレータは、設定を解除することができますし、 は配列とオブジェクトを反復処理しながら、値とキーを変更します。
あなたはArrayObjectをインスタンス化し、それがforeachのを使用するか、手動でその getIterator()メソッドを呼び出すことにより、どちらかそれを参照 ArrayIteratorのインスタンスを作成できるようにする を必要と同じ配列を複数回反復処理したいです。
も読み:
申し訳ありませんが私の質問を明確にしていない - はい、私は彼らがほとんど同じことをするように思える。私は、誰かが実際の違いが彼らと他の人とを選択する理由を説明できるかどうか疑問に思っていました。これは、ここに掲載するのに適した質問ではない場合、私は謝罪し、この記事を削除して自由に感じてください! – jkhamler
Array
は、ネイティブなPHPの型です。あなたはarray()
を構築するPHP言語を使用して作成することができ、またはPHP 5.4のよう以降[]
ArrayObject
は正確に配列のように動作しobject
です。これらは、new
キーワード
を使用して作成することができます。ArrayObject
と同じですが、それ自体は繰り返し処理が可能です。また、彼らの両方が、例えばのために、PHPの配列構文を使用して使用することができますArray
(ArrayObject
/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つのオブジェクトがあります。これは、大規模な配列では効率が悪いことがわかります。ただし、イテレータに使用するクラスを指定できるため、コードにカスタムイテレータを含めることができます。
希望します。この回答の編集は大歓迎です。
説明はarrayIteratorがすべて間違っていることです。私の答えを読んでください。 – David
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に項目を追加します。つまり、イテレータは、カプセル化と呼ばれるものを提供するために、配列の周りのシェルのようなものです。
array
は、PHPの8つのプリミティブ型の1つです。それには、多くの組み込みのユーティリティ関数が付属していますが、すべて手続き型です。
ArrayObject
とArrayIterator
はどちらも、オブジェクト指向プログラム(OOP)で配列第一級市民を作ることができます。 ArrayObject
とArrayIterator
間
違いはArrayIterator
がSeekableIterator
インタフェースを実装しているので、あなたがArrayIterator
と$myArray->seek(10);
を行うことができます、ということです。
Iteratorは、プログラマーがコンテナ、特にリストをトラバースできるようにするオブジェクトです。さまざまなタイプのイテレータが、しばしばコンテナのインタフェースを介して提供されます。
ArrayObject
とArray
は、異なるオブジェクトタイプを使用していても同じことを表しているため、大きな違いはありません。
ArrayIterator
はArray-like
オブジェクトを反復、これはArrayAcess
を実装するすべてのオブジェクトとネイティブArray
タイプを含むことがイテレータです。あなたが見ることができます配列を超えるforeach
、PHPは内部的に、これを入力したかのように見えるようにトラバースを行うと、あなたのコードを変換するために
for($arrayIterator->rewind(); $arrayIterator->valid(); $arrayIterator-
>next())
{ $key = $arrayIteartor->key();
$value = $arrayIterator->current();
}
をArrayIterator
を作成しますので、すべてのコレクションオブジェクトは、以外のIteratorを持って実際に 、独自のイテレータを定義するために必要な定義済みのコレクション
- 1. PHPの違いarray()と[]
- 2. PHP ArrayObjectの内部動作
- 3. ArrayIteratorまたはArrayObjectをimplodeで使用するにはどうすればよいですか?
- 4. PHPのArrayとHashの違いは何ですか?
- 5. ArrayObject、getIterator();
- 6. if(!$ array)とif(empty($ array))の間に違いがあります
- 7. PHP QueryString with Array
- 8. php array output
- 9. PHP xmlreader to array
- 10. Array Object in PHP
- 11. php array poker hand result
- 12. if else inside array-php
- 13. php arrayObjectを使用した致命的な例外処理
- 14. JavascriptのMathとArrayの違いは何ですか?
- 15. numpyのndarrayとarrayの違いは何ですか?
- 16. PHPのArrayObjectにはin_arrayと同等のものがありますか?
- 17. std :: valarrayとstd :: arrayの違いは何ですか
- 18. IEnumerableとArray、IList、Listの違いは何ですか?
- 19. PHPの `array()`関数内のIFステートメント
- 20. Weighted Arrayの結果のPHP配列
- 21. MySQL SELECT WHERE php array equivalent
- 22. MySQL PHP - SELECT where where = array()?
- 23. PHPのバージョンの違い
- 24. PHPのカウントダウンタイマーの間違い
- 25. PHPの::と - の違いは?
- 26. 違いは、PHP
- 27. HTTPヘッダの違い(PHP)
- 28. <の違いは? <?php
- 29. phpとsqlの違いは?
- 30. C#とPHP OOPの違い
[ArrayIterator](http://www.php.net/ArrayIterator)、[ArrayObject](http://www.php.net/ArrayObject)、[Array](http:// www。 php.net/Array)?それはおそらくあなたが必要とするすべての情報です。 – vascowhite
また、[Stackoverflowはあなたの個人研究のアシスタントではありません](http://meta.stackexchange.com/a/128553/164367) – vascowhite