2

キーがオブジェクトである可能性のあるJava/C#のようなコレクションを実装するためにphp.netの例を変更しようとしました(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

key()その位置の要素ではなく、位置を返す必要があります。配列の世界にいると想像すると、たとえば、値ではなくキーを返します。

のマニュアルはkey()言う:

現在の要素のキーを返します。

成功した場合はスカラーを返し、失敗した場合はNULLを返します。

現在の位置にある要素を返したい場合は、以下を使用してくださいcurrent()

現在の要素を返します。

任意のタイプを返すことができます。

更新:残念ながら、オブジェクトをキーとして使用することはできません。

于 2012-05-21T08:51:05.427 に答える
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

PHP 5.5以降を使用している場合は、次のように機能します。

foreachは非スカラーキーをサポートするようになりました

foreachは、あらゆるタイプのキーをサポートするようになりました。非スカラーキーはネイティブPHP配列では発生しませんが、Iterator::key()任意の型の値を返すことが可能であり、これは正しく処理されるようになりました。

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

于 2015-06-18T10:07:03.583 に答える