2

我有一个 SPLObjectStorage 对象,其中一个 Player 对象作为键,分数作为与之关联的信息。播放器对象按从最高到最低的顺序添加到存储中,但我现在到了需要以相反顺序遍历它们的地步。

我还需要能够从指定的偏移量开始一直循环。我已经在下面找到了这部分,我只是想不出一个好的方法来扭转它。

// $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是 akey->value store 和 中一个元素的“key”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 回答