2012-06-17 50 views
15

我想使用與PHP迭代器的關聯數組接着迭代方法:用於關聯數組

http://php.net/manual/en/class.iterator.php

可以嗎?

我定義了這些方法:

public function rewind(){  
    reset($this->_arr); 
    $this->_position = key($this->_arr); 
    } 

    public function current(){  
    return $this->_arr[$this->_position]; 
    } 

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

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

    public function valid(){  
    return isset($this->_arr[$this->_position]); 
    } 

問題是它不能正常循環。我只得到一個元素。

我認爲這是因爲next()方法中的++$this->_position代碼沒有任何效果,因爲_position是一個字符串(關聯數組的關鍵字)。

那麼我該如何去這種類型的數組的下一個元素?

+4

出於好奇功能,你爲什麼不只是使用[ ArrayIterator(http://us.php.net/arrayiterator)? – nickb

+0

可以請你展示更多你的代碼嗎?那將是a)你說'class XYZ實現Iterator'的部分b)你嘗試使用它的部分。 – Niko

+1

「我定義了這些方法」 - 它被稱爲「按原樣複製粘貼」;-) – zerkms

回答

27
function rewind() { 
    reset($this->_arr); 
} 

function current() { 
    return current($this->_arr); 
} 

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

function next() { 
    next($this->_arr); 
} 

function valid() { 
    return key($this->_arr) !== null; 
} 
+0

在'foreach'循環中,我假設這不會返回一個鍵 - 只有一個數字表示。正確? –

+0

@Rambo,可能想檢查編輯 – OGHaza

+0

@OGHaza謝謝。我認爲他的最新編輯對我來說似乎沒問題?我的原始代碼沒有錯誤,但我想我喜歡他最新的編輯稍微好一些。 – goat

2

http://ideone.com/Fxt0j

class myIterator implements Iterator { 
    private $position = 0; 
    private $keys; 

    public function __construct(array $arr) { 
     $this->array = $arr; 
     $this->keys = array_keys($arr); 
     $this->position = 0; 
    } 

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

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

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

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

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

$it = new myIterator(array(
     'a' => "firstelement", 
     'b' => "secondelement", 
     'c' => "lastelement", 
    )); 

foreach($it as $key => $value) { 
    var_dump($key, $value); 
    echo "\n"; 
} 
+3

如果對代碼進行評論和解釋,那麼此代碼將更加有用,因此除OP之外的其他人可以從您的知識中受益。 – Haroon

+1

@Haroon:它只使用基本的構造。如果有人能得到它 - 那麼現在是學習基礎知識的時候了 – zerkms

+2

我真的,真的不明白爲什麼還要重新發明輪子......使用從ArrayObject獲得的ArrayIterator,關聯數組變得更加簡單。 ..並且無需寫下我們自己的ArrayIterator ... – shadyyx

5

爲什麼不創建從您的關聯ArrayArrayObject?然後你可以從這個ArrayObjectgetIterator(),並呼籲key()next()等就可以了,只要你想......

一些示例:

$array = array('one' => 'ONE', 'two' => 'TWO', 'three' = 'THREE'); 
// create ArrayObject and get it's iterator 
$ao = new ArrayObject($my_array); 
$it = $ao->getIterator(); 
// looping 
while($it->valid()) { 
    echo "Under key {$it->key()} is value {$it->current()}"; 
    $it->next(); 
} 

ArrayObject
ArrayIterator

1
class MyItrator implements Iterator 
{ 
    private $_arr; 

    public function __construct(array $arr) 
    { 
     $this->_arr = $arr; 
    } 


    public function rewind() 
    { 
     reset($this->_arr); 
    } 

    public function current() 
    { 
     return current($this->_arr); 
    } 

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

    public function next() 
    { 
     next($this->_arr); 
    } 

    public function valid() 
    { 
     return isset($this->_arr[key($this->_arr)]); 
    } 
} 
0

我知道這是一個古老的問題,但它可以像

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

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

public function key() 
{ 
    return array_keys($this->array)[$this->position]; 
} 

public function valid() 
{ 
    return array_key_exists($this->position, array_keys($this->array)[$this->position]); 
} 

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

我知道了類似的答案被張貼@zerkms但恕我直言,這並不工作,如果該對象已建成和你有一個擴展陣列