2

我尝试修改 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() 返回非法类型

我该如何解决?

4

5 回答 5

5

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

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

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

然而,手动获取密钥确实没有问题,有时甚至对于作为迭代器但返回数组作为密钥的 PHP 内置类是必要的,例如使用MultipleIterator.

于 2012-05-21T16:43:33.850 回答
1

键的类型必须是标量。该错误是由于您的key方法返回一个对象引起的。返回字符串或数字类型,它应该可以工作。

于 2012-05-21T08:50:57.527 回答
0

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

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

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

foreach ($iterator as $key_and_value) {
    list($key, $value) = $key_and_value;
}
于 2013-03-29T17:17:04.630 回答
0

key()应该返回位置,而不是该位置的元素。如果我们想象我们在数组世界中,假设:返回键,而不是值。

手册上key()说:

返回当前元素的键。

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

如果要返回当前位置的元素,请使用current()

返回当前元素。

可以返回任何类型。

更新:不幸的是,您不能将对象用作键。

于 2012-05-21T08:51:05.427 回答
0

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

foreach 现在支持非标量键

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

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

于 2015-06-18T10:07:03.583 回答