2016-10-01 58 views
0

我很難理解PHP的iterator_to_array函數。什麼是PHP中的iterator_to_array函數?

我嘗試閱讀手冊,但沒有幫助。

這是什麼?我如何使用它?什麼是適當的用例?

+2

閱讀更多:http://php.net/manual/en/function.iterator-to-array.php – Dave

+0

感謝評論..我沒有得到完全通過手冊,所以我問這裏? –

+0

當你有迭代器(實現接口迭代器的對象http://php.net/manual/en/class.iterator.php)時,你可以通過函數「iterator_to_array」獲得返回「當前」方法的元素數組,如果你使用參數「$ use_keys」方法鍵的結果將被用作返回數組的鍵。 –

回答

2

簡而言之,iterator_to_array()函數採用類型爲Traversable的迭代器,並根據提供的參數將其轉換爲關聯/非關聯數組。從the documentation

array iterator_to_array (Traversable $iterator [, bool $use_keys = true ]) 

該函數採用以下兩個參數,

  • 第一個參數是Traversal類型的,這是一個接口。類IteratorAggregateIterator類擴展了這個接口。您可以在自定義類實現這兩個類,像這樣:

    class myIterator implements IteratorAggregate { 
        private $array = array('key1'=>'value1', 'value2', 'value3', 'value4'); 
    
        public function getIterator(){ 
         return new ArrayIterator($this->array); 
        } 
    } 
    
    $obj = new myIterator; 
    $array = iterator_to_array($obj->getIterator(), true); 
    var_dump($array); 
    

    或者,

    class myIterator implements Iterator { 
        private $key; 
        private $array = array('key1'=>'value1', 'value2', 'value3', 'value4'); 
    
        public function __construct(){ 
         $this->key = key($this->array); 
        } 
    
        public function rewind(){ 
         reset($this->array); 
         $this->key = key($this->array); 
        } 
    
        public function current(){ 
         return $this->array[$this->key]; 
        } 
    
        public function key(){ 
         return $this->key; 
        } 
    
        public function next(){ 
         next($this->array); 
         $this->key = key($this->array); 
        } 
    
        public function valid(){ 
         return isset($this->array[$this->key]); 
        } 
    } 
    
    $obj = new myIterator; 
    $array = iterator_to_array($obj, true); 
    var_dump($array); 
    

    最重要的一點這裏要注意的是,參數1傳遞給iterator_to_array()功能必須實現接口Traversable,所以你不能直接傳遞任何其他類型的數組或對象到這個函數。請看下面的例子,

    $array = array('key1'=>'value1', 'value2', 'value3', 'value4'); 
    $array = iterator_to_array($array, true); // wrong 
    
  • 第二個參數是一個布爾值,以指示是否使用迭代器元件的鍵作爲索引或沒有。見Example #1 here。因爲它們允許你一個foreach循環中使用的數據的自定義的順序

0

迭代器是有用的。讓我們藉此從the PHP manual(略回吐下)例如:

class myIterator implements Iterator { 
    private $position = 0; 
    private $array = array(
     "firstelement", 
     "secondelement", 
     "lastelement", 
    ); 

    public function __construct() { 
     $this->position = 0; 
    } 

    function rewind() { 
     $this->position = 0; 
    } 

    function current() { 
     return $this->array[$this->position]; 
    } 

    function key() { 
     return $this->position; 
    } 

    function next() { 
     ++$this->position; 
    } 

    function valid() { 
     return isset($this->array[$this->position]); 
    } 
} 

$it = new myIterator; 

遍歷它,我們可以使用一個foreach環就像一個數組:

foreach($it as $ele){ 
    echo $ele; 
} 

不像陣列,但是,如果不先迭代它,則無法訪問單個元素。嘗試這樣做會給你一個致命的錯誤:

/* 
* Fatal error: Uncaught Error: Cannot use object of type myIterator as array 
* in /home/hpierce/sandbox.php 
*/ 
echo $it[1]; 

//Iterating to the second element. 
$it->next(); 

// "secondelement" 
echo $it->current(); 

要訪問一個單一的元素,你可以使用iterator_to_array()投迭代器作爲一個數組,然後訪問該元素沒有額外的步驟:

$array = iterator_to_array($it); 

// "secondelement" 
echo $array[1]; 

如果您事先知道需要訪問迭代器中的單個元素,則應該考慮使用ArrayIterator代替。