有没有办法在PHP上用类实现Iterator的对象上进行操作?

时间:2012-05-21 08:38:53

标签: php iterator

我尝试修改php.net中的示例,试图实现类似Java / C#的集合,其中键可以是对象(http://php.net/manual/en/language.oop5.iterations.php,示例#2):

<?php
class Test {
        private $_n;
        public function __construct($n) {
              $this->_n = $n;  
        }
        public function getN() {
                return $this->_n;
        }
}
class MyIterator implements Iterator
{
    private $var = array();

   // code from php.net ....

    public function key() 
    {
        $var = key($this->var);
        echo "key: $var\n";

        return new Test($var);
    }

    // code from php.net...

}

$values = array(1,2,3);
$it = new MyIterator($values);

foreach ($it as $a => $b) {
    print $a->getN() . ": $b\n";
}

但我有这样的注意事项:

  

警告:从MyIterator :: key()返回非法类型

我该如何解决?

5 个答案:

答案 0 :(得分:5)

您正在寻找的内容很容易,但是,您需要帮助foreach一点:

foreach ($it as $b) {
    $a = $it->key();
    print $a->getN() . ": $b\n";
}

背景:foreach只能处理整数或字符串的键(有人说是标量,我更喜欢数组键类比),但不能处理数组或对象。

然而,手动获取密钥确实可以正常工作,有时甚至需要PHP内置类作为迭代器,但返回一个数组作为键,for example with MultipleIterator

答案 1 :(得分:1)

的类型必须是标量。导致该错误的原因是您的key方法正在返回一个对象。返回字符串或数字类型,它应该可以工作。

答案 2 :(得分:0)

key()应该返回位置,而不是该位置的元素。如果我们想象我们处于数组世界,那么就说:返回键,而不是值。

key()上的手册说:

  

返回当前元素的键。

     

成功时返回标量,失败时返回NULL。

如果您想在当前位置返回元素,请使用current()

  

返回当前元素。

     

可以返回任何类型。

更新:遗憾的是,您无法将对象用作密钥。

答案 3 :(得分:0)

另一种解决方法:让当前返回一个带有键和值的数组......

function current() {
    return array($this->key, $this->val);
}

...然后在循环中解压缩数组:

foreach ($iterator as $key_and_value) {
    list($key, $value) = $key_and_value;
}

答案 4 :(得分:0)

如果您使用PHP 5.5或更高版本,它将起作用:

  

foreach现在支持非标量键

     

foreach现在支持任何类型的键。虽然非标量键不能   在本机PHP数组中,Iterator::key()可能会发生   返回任何类型的值,现在将正确处理。

http://php.net/manual/de/migration55.new-features.php