Сортировка RecursiveArrayIterator

У меня есть следующий код:

$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 как первый элемент.

К несчастью, документация нет никаких упоминаний о проблеме, поэтому я хотел бы знать, если это ошибка или я что-то пропустил?

ОБНОВИТЬ

Код итерации:

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

Моя версия php 5.3.10, на случай, если это актуально.
Суть с провал модульного теста.

0

Решение

Это выглядит как 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
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]