排序递归数组迭代器
Sorting 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
作为第一个元素。
不幸的是,documentation 没有提到这个问题,这就是为什么我想知道这是一个错误还是我遗漏了什么?
更新
迭代代码:
while ($collection->valid())
{
$current = $collection->current(); // current is already wrong :(
... do stuff ...
$collection->next();
}
我的 php 版本是 5.3.10,以防相关。
要点 failing unit test.
看起来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
我有以下代码:
$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.
看起来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