我正在尝试按特定字段对ArrayCollection
进行排序。 ArrayCollection
是一系列课程。在Course
实体中,有一个称为isLive
的方法,该方法返回布尔值。
我想对这个集合进行排序,以使“实时”课程位于数组的开头,因此这些课程是从true
调用返回isLive
的。
这是我目前拥有的代码,但是$sorted
数组中的第一个条目不是实时课程。
$iterator = $this->courses->getIterator();
$iterator->uasort(function ($a, $b) {
if ($a->isLive() == $b->isLive()) {
return 0;
}
return ($a->isLive() < $b->isLive()) ? -1 : 1;
});
$sorted = new ArrayCollection(iterator_to_array($iterator));
答案 0 :(得分:0)
对于Doctrine Criteria来说,这似乎是一个很好的用例。它们允许对ArrayCollections进行过滤/排序(如果已经加载了集合,则在内存中),或者通过在下次从数据库加载集合时添加一个WHERE
/ ORDER BY
SQL子句来对ArrayCollections进行过滤/排序。因此,这已经非常优化了!
假设您在live
后面有一个isLive()
字段,代码应该看起来像这样:
$criteria = Criteria::create()
->orderBy(["live" => Criteria::DESC])
;
$sorted = $this->courses->matching($criteria);
答案 1 :(得分:0)
我使用了uasort
和array_search
来解决问题,如下所示:
/**
* @return ArrayCollection
*/
public function getCoursesSortedByLive(): ArrayCollection
{
$coursesIterator = $this->courses->getIterator();
$sortOrder = [true];
$coursesIterator->uasort(function ($a, $b) use ($sortOrder) {
return array_search($a->isLive(), $sortOrder) - array_search($b->isLive(), $sortOrder);
});
return new ArrayCollection(iterator_to_array($sitesIterator));
}
答案 2 :(得分:0)
对于实体,执行以下操作:向属性添加 OrderBy 注释。
/**
* @OneToMany(targetEntity="Course")
* @OrderBy({"live": "ASC"})
*/
private $courses;