2

キーとしてPlayerオブジェクトを持ち、それに関連付けられた情報としてスコアを持つSPLObjectStorageオブジェクトがあります。プレーヤーオブジェクトは、スコアの高いものから低いものの順にストレージに追加されますが、今は逆の順序でオブジェクトを繰り返す必要があります。

また、指定されたオフセットから開始するまでループできる必要があります。私はこの部分を以下で理解しました、私は最初にそれを逆転させる良い方法を理解することができません。

// $players_group = new SPLObjectStorage()
// code to add Player and Score would go here
// above lines just for example

# NEED TO REVERSE ORDER PLAYERS GROUP HERE

$infinite_it = new InfiniteIterator($players_group);
$limit_it = new LimitIterator($infinite_it, $current_offset, $players_group->count());
foreach($limit_it as $p){
    // properly outputting from offset all the way around
    // but I need it in reverse order
}

ストレージオブジェクトをループしてすべてを配列にプッシュし、array_reverseを実行して、最後にforeachループを続行する必要がないようにしたいと思います。

4

2 に答える 2

3

SplObjectStorageはでkey->value store あり、の要素の「キー」はSplObjectStorage実際にはオブジェクトのハッシュです。並べ替えと元に戻すには、独自の実装を拡張して作成する必要がありますが、使用を検討する必要があると思いますSplStack

プレーヤークラスを想像してみてください

class Player {
    private $name;
    function __construct($name) {
        $this->name = $name;
    }
    function __toString() {
        return $this->name;
    }
}

使用するSplStack

$group = new SplStack();
$group->push(new Player("Z"));
$group->push(new Player("A"));
$group->push(new Player("B"));
$group->push(new Player("C"));

echo "<pre>";
$infinite_it = new InfiniteIterator($group);
$limit_it = new LimitIterator($infinite_it, 0, 3); // get frist 3
foreach ( $limit_it as $p ) {
    echo ("$p");
}

あなたが主張するならSplObjectStorage、あなたは習慣を考えることができますReverseArrayIterator

class ReverseArrayIterator extends ArrayIterator {
    public function __construct(Iterator $it) {
        parent::__construct(array_reverse(iterator_to_array($it)));
    }
}

使用法

$group = new SplObjectStorage();
$group->attach(new Player("Z"));
$group->attach(new Player("A"));
$group->attach(new Player("B"));
$group->attach(new Player("C"));

echo "<pre>";
$infinite_it = new InfiniteIterator(new ReverseArrayIterator($group));
$limit_it = new LimitIterator($infinite_it, 0, 3); // get frist 3
foreach ( $limit_it as $p ) {
    echo ("$p");
}

両方とも出力します

CBA //reversed 
于 2012-12-29T10:18:47.783 に答える
2

ストレージオブジェクトをループしてすべてを配列にプッシュし、array_reverseを実行して、最後にforeachループを続行する必要がないようにしたいと思います。

それが最も効率的な方法かどうかはわかりませんが、SplObjectStorageはIteratorを実装しているため、iterator_to_arrayを使用してから、配列を逆にすることができます。

array_reverse(iterator_to_array($players_group));
于 2012-12-29T10:10:48.130 に答える