在PHP

2012-05-08 22 views
22

ArrayIterator,ArrayObject的和陣列之間的差異有人可以解釋的功能和操作方面ArrayIterator,在PHP ArrayObject和陣列之間明確的根本區別是什麼?謝謝!在PHP

+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

可能你會在這裏找到答案:

這個迭代器允許取消設置並同時 遍歷數組和對象修改值和密鑰。

當你想,你需要 實例ArrayObject的,讓它創建ArrayIterator實例 ,要麼使用的foreach或通過手動調用其 getIterator()方法方法是指它在同一陣列多次迭代。

而且讀:

+12

對不起,我沒有讓我的問題清楚 - 是的,我已閱讀PHP文檔三但在我看來,他們做的事情幾乎是一回事。我想知道是否有人能夠解釋他們之間的實際區別,以及爲什麼你會選擇一個。如果這不是一個合適的問題張貼在這裏然後我道歉,請隨時刪除這篇文章! – jkhamler

19

Array PHP原生型。您可以使用PHP語言構建array()創建一個,或PHP 5.4的起[]

ArrayObjectobject的工作完全一樣的陣列。這些可以使用new關鍵字

ArrayIterator就像ArrayObject創建,但它可以迭代本身。還使用new


比較Array VS(ArrayObject/ArrayIterator

他們都可以使用PHP數組的語法來使用,例如創建。

$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 

然而,他們仍然反對VS陣列,所以你會發現在

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 ...... 

最後,對象可以做你期望從stdClass對象是什麼,即訪問使用對象語法

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

陣列(即原生型)的公共屬性遠遠快於對象。在另一邊,ArrayObject & ArrayIterator類有一定的方法來定義的,你可以使用,而沒有用於陣列


比較ArrayObject沒有這樣的事情VS ArrayIterator

這兩個之間的主要區別是在類的方法中。

ArrayIterator implements Iterator接口,它給它的方法有關元素的迭代/循環。 ArrayObject有一個名爲exchangeArray的方法,它將內部數組與另一個交換。在ArrayIterator中實現類似的事情將意味着要麼創建一個新的對象,要麼循環通過所有的鍵& unset &然後逐個設置新陣列中的元素。

接着,由於ArrayObject不能被重複,當你在foreach使用它它創建一個內部對象ArrayIterator(同陣列)。這意味着php創建一個原始數據的副本&現在有2個對象具有相同的內容。這對於大型陣列來說將證明是低效的。但是,您可以指定哪個類用於迭代器,因此您可以在代碼中使用自定義迭代器。


希望這會對您有所幫助。歡迎對這個答案進行編輯。

+0

解釋是關於arrayIterator是全錯的。閱讀我的答案。 – David

7

ArrayObject和數組有點相似。僅僅是一些對象(或本機類型)的集合。他們有一些可以調用的不同方法,但大部分歸結爲同樣的事情。

但是,迭代器是完全不同的東西。迭代器設計模式是一種保護數組的方法(使其只能讀取)。讓我們看看下面的例子:

你有一個有數組的類。您可以使用addSomethingToMyArray將項目添加到該數組。但請注意,在我們將其添加到數組之前,我們會對項目進行一些操作。這可能是任何事情,但讓我們暫時表現爲,對於我們想要添加到數組中的每個項目,都會觸發此方法,這非常重要。

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

    public function addSomethingToMyArray($item) 
    { 
     $this->doSomethingToItem($item); 
     array_push($item); 
    } 
} 

這個問題,是你在這裏通過引用傳遞數組。這意味着實際使用returnMyArray的類將獲得真正的myArray對象。這意味着除A以外的類可以將數組添加到該數組,因此也可以更改A中的數組而不必使用addSOmethingToMyArray。但我們需要做的事情,記得嗎?這是一個不控制自己內在地位的階級的例子。

對此的解決方案是一個迭代器。我們將數組傳遞給一個只能從數組中讀取數據的新對象,而不是傳遞數組。最簡單的迭代器是這樣的:

<?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; 
    }  
} 

?>

正如你所看到的,我也沒有增加新的項目,以給定數組的方式,但我有posibilities閱讀陣列是這樣的:

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

現在再次出現,只有一個辦法將項目添加到A中的myArray,即通過addSomethingToArray方法。所以這就是Iterator的意義,它是一個圍繞數組的外殼,提供了一種叫做封裝的東西。

0

array是PHP中的八種基本類型之一。雖然它有很多內置的實用功能,但它們都是程序性的。

ArrayObjectArrayIterator都允許我們在面向對象的程序(OOP)中創建數組頭等公民。 ArrayObjectArrayIterator之間

不同的是,由於ArrayIterator實現SeekableIterator接口,你可以做$myArray->seek(10);ArrayIterator

0

Iterator是一個讓程序員遍歷容器的對象,特別是列表。通常通過容器的接口提供各種類型的迭代器。

ArrayObjectArray之間沒有太大差別,因爲它們表示相同的東西,儘管使用了不同的對象類型。

ArrayIterator是迭代器,迭代Array-like對象,這包括該實施ArrayAcess所有對象和天然Array類型。 事實上,當你foreach一個數組,PHP內部創建ArrayIterator做橫動,彷彿輸入這個改變你的代碼看,

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

所以你可以看到,每一個集合對象具有除了一個Iterator您需要定義您自己的迭代器的定義集合。