对RecursiveArrayIterator进行排序

时间:2015-02-11 08:47:08

标签: php iterator spl

我有以下代码:

$itemA = array(
        'token' => "SOME_TOKEN",
        'default' => "DEFAULT A",
        'order' => 5
);
$itemB = array(
        'token' => "SOME__OTHER_TOKEN",
        'default' => "DEFAULT B",
        'order' => 2
);
$collection = new \RecursiveArrayIterator(array($itemA, $itemB));
$collection->uasort(function( $a, $b ) {
        if ($a['order'] === $b['order']) {
                return 0;
        }
        return ($a['order'] < $b['order']) ? -1 : 1;
});

应该对$collection内部数组进行排序。事实上,确实如此,因为当我var_dump($collection)时 - 我可以看到$itemB是第一个(因为它有较低的顺序)。

但是 - 当我开始从$collection迭代项目时,我仍然将$itemA作为第一个元素。

不幸的是,documentation没有提到这个问题,这就是为什么我想知道这是一个错误还是我错过了什么?

更新

迭代代码:

while ($collection->valid())
{
    $current = $collection->current(); // current is already wrong :(
    ... do stuff ...
    $collection->next();
}

我的php版本是5.3.10,如果这是相关的。 请注明failing unit test

1 个答案:

答案 0 :(得分:2)

看起来uasort会影响迭代器的内部current指针,因此在循环之前需要$collection->rewind()。更好的是,使用while(valid)而不是foreach,它会自动为您回复:

$collection = new \RecursiveArrayIterator(...);
$collection->uasort(function( $a, $b ) {
    return $a['order'] - $b['order'];
});

foreach($collection as $item)
    print_r($item); // all fine