Php &引用;usort“;条令\Common\Collections\ArrayCollection?

Php &引用;usort“;条令\Common\Collections\ArrayCollection?,php,doctrine-orm,Php,Doctrine Orm,在各种情况下,我需要根据对象中的属性对原则\Common\Collections\ArrayCollection进行排序。在没有找到立即执行此操作的方法的情况下,我执行以下操作: // $collection instanceof Doctrine\Common\Collections\ArrayCollection $array = $collection->getValues(); usort($array, function($a, $b){ return ($a->g

在各种情况下,我需要根据对象中的属性对
原则\Common\Collections\ArrayCollection
进行排序。在没有找到立即执行此操作的方法的情况下,我执行以下操作:

// $collection instanceof Doctrine\Common\Collections\ArrayCollection
$array = $collection->getValues();
usort($array, function($a, $b){
    return ($a->getProperty() < $b->getProperty()) ? -1 : 1 ;
});

$collection->clear();
foreach ($array as $item) {
    $collection->add($item);
}
/$collection instanceof Doctrine\Common\Collections\ArrayCollection
$array=$collection->getValues();
usort($array,function($a,$b){
返回($a->getProperty()<$b->getProperty())?-1:1;
});
$collection->clear();
foreach($数组作为$项){
$collection->add($item);
}

当您必须将所有内容复制到本机PHP数组并返回时,我认为这不是最好的方法。我想知道是否有更好的方法“usort”a
Doctrine\Common\Collections\ArrayCollection
。我是否遗漏了任何文档?

要对现有集合进行排序,请查找返回ArrayIterator的ArrayCollection::getIterator()方法。例如:

$iterator = $collection->getIterator();
$iterator->uasort(function ($a, $b) {
    return ($a->getPropery() < $b->getProperty()) ? -1 : 1;
});
$collection = new ArrayCollection(iterator_to_array($iterator));
。。。使排序变得相当容易


希望对您有所帮助。

由于原则2.3,您可以使用

例如:


如果您有一个ArrayCollection字段,您可以使用注释进行订购。例如:

假设一个名为Society的实体拥有许多许可证。你可以用

/**
* @ORM\OneToMany(targetEntity="License", mappedBy="society")
* @ORM\OrderBy({"endDate" = "DESC"})
**/
private $licenses;
将按endDate(datetime字段)按描述顺序对ArrayCollection排序


请参阅条令文档:

条令标准不允许按相关对象上的属性排序

如果你想这样做(像我一样),你必须像前面的响应一样使用迭代器的
uasort
方法,如果你使用PHP7,你可以像这样使用Spaceship操作符

/**@var\ArrayIterator$iterator*/
$iterator=$this->optionValues->getIterator();
$iterator->uasort(函数(ProductOptionValue$a,ProductOptionValue$b){
返回$a->getOption()->getPosition()$b->getOption()->getPosition();
});
返回新的ArrayCollection(迭代器_to_数组($迭代器));

Iterator进行排序,但似乎没有写入集合。。。我遗漏了什么吗?更新了我的答案!我想我知道你想要什么-将迭代器添加到数组中。。。现在可以接受吗?:)是否可以将
uasort
替换为
usort
?我试过了,但是我得到了erorr-
对未定义的方法ArrayIterator::usort()的调用。
usort尚未为ArrayIterator实现。。。所以这目前是不可能的。谷歌'你会发现一些功能要求和一些stackoverflow关于这个问题的问题。希望能帮助其他人找到这个,您也可以使用$a=$collection->toArray()将ArrayCollection转换为数组;后跟$collection=newarraycollection($a);这只适用于Doctrine的ORM,ODM的持久集合不支持匹配。实际上,您可以对集合对象本身执行基本的匹配和排序标准。来自docs:“标准有一个有限的匹配语言,可以在SQL和PHP集合级别上工作。”。超级方便!如果属性(即created_at)不是公共的,则它似乎不起作用:(我阅读或测试了它,我认为它需要一个公共变量或一个名为getCreated_at()的方法)或者类似的方法来获取信息。这很糟糕,因为我通常不准备使用我的getter方法。@dubrox如@Clutch所述,您需要一个公共getter方法
getCreatedAt
请注意,因为它不会在“急取”模式下工作。
<?php

public function getSortedComments()
{
    $criteria = Criteria::create()
      ->orderBy(array("created_at" => Criteria::ASC));

    return $this->comments->matching($criteria);
}
/**
* @ORM\OneToMany(targetEntity="License", mappedBy="society")
* @ORM\OrderBy({"endDate" = "DESC"})
**/
private $licenses;