我正在寻找一种干净的方式来扭转Doctrine_Collection的顺序.我知道这听起来很奇怪,所以让我解释一下我的(简单)目标:我需要显示x 最新/最新的记录,但我必须以相反的顺序显示它:最老的第1个等等.
如果不清楚,这是一个例子:让我说我在我的表中有这个(让我们称之为'示例'):
id date
1 2012-01-21
2 2012-03-19
3 2012-02-21
4 2012-03-21
Run Code Online (Sandbox Code Playgroud)
到目前为止,我已经这样做了:
Doctrine::getTable('Example')->createQuery('d')
->orderBy('date DESC')
->limit(3);
Run Code Online (Sandbox Code Playgroud)
哪个回来了
id date
4 2012-03-21
2 2012-03-19
3 2012-02-21
Run Code Online (Sandbox Code Playgroud)
但我希望如此:
id date
3 2012-02-21
2 2012-03-19
4 2012-03-21
Run Code Online (Sandbox Code Playgroud)
编辑:
我找到了一个解决方案,使用中间数组并使用array_reverse.但它看起来不太好:(
这是我写的代码:
$query = Doctrine::getTable('Example')
->createQuery('e')
->orderBy('date DESC')
->limit(3)
$collection = $query->execute();
//Here is the dirty hack:
$itemArray = array();
foreach ($collection as $item) {
$itemArray[] = $item;
}
$itemArray = array_reverse($itemArray);
$orderedCollection = new Doctrine_Collection($doctrineClass);
foreach($itemArray as $item) { …
Run Code Online (Sandbox Code Playgroud) 我目前正在将项目从php5.6迁移到php7.1.大多数情况进展顺利,但我只是在墙上进行了一次测试.
函数usort在两个版本上都没有相同的行为,并且它似乎没有记录(不是两个值是等于,然后顺序是未定义的).在我的测试用例中,返回的数组顺序是相反的.
这是问题的再现.请注意,我一直返回-1以简化(我在这里专注于PHP5.6和7之间的差异)
代码在两个版本上运行:
$a = [['value' => 1, 'toto' => 'toto'], ['value' => 1, 'toto' => null]];
usort($a, function ($a, $b) { return -1;});
print_r($a);
Run Code Online (Sandbox Code Playgroud)
PHP 5.6中的结果:
Array
(
[0] => Array
(
[value] => 1
[toto] =>
)
[1] => Array
(
[value] => 1
[toto] => toto
)
)
Run Code Online (Sandbox Code Playgroud)
PHP 7.1
Array
(
[0] => Array
(
[value] => 1
[toto] => toto
)
[1] => Array
(
[value] => 1
[toto] =>
)
)
Run Code Online (Sandbox Code Playgroud)