2012-06-17 25 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但恕我直言,这并不工作,如果该对象已建成和你有一个扩展阵列