У меня есть следующий код:
$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, на случай, если это актуально.
Суть с провал модульного теста.
Это выглядит как 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
Других решений пока нет …