我试图在Symfony中按名称对对象数组进行排序。但是我不知道该怎么做,因为字符串以数字开头,所以顺序不好。
我在存储库中尝试使用queryBuilder:
$qb = $this->createQueryBuilder('arrondissement')
->addOrderBy('arrondissement.nom', 'ASC');
$query = $qb->getQuery();
return $query->execute();
还有控制器中的sort()函数,
但是正如您所看到的,这并不完全是。我喜欢这样的东西:1er arrondissement,2e ....,20e ...,Paris
答案 0 :(得分:0)
例如,您可以使用php natsort
:
$arr = [
'10e arrondrissement',
'1e arrondrissement',
'8e arrondrissement',
'2e arrondrissement',
'5e arrondrissement',
];
natsort($arr);
print_r($arr);
会返回:
Array (
[1] => 1e arrondrissement
[3] => 2e arrondrissement
[4] => 5e arrondrissement
[2] => 8e arrondrissement
[0] => 10e arrondrissement
)
答案 1 :(得分:0)
在这种情况下,恕我直言,您不应该通过PHP更改顺序,但为此使用数据库排序。
这是我的修改查询生成器的建议:
$qb = $this->createQueryBuilder('arrondissement')
->add( 'orderBy', 'CAST(arrondissement.nom AS UNSIGNED), arrondissement.nom')
$query = $qb->getQuery();
return $query->execute();
答案 2 :(得分:-1)
在教义中,您无法轻易按自然顺序对字符串/对象进行排序。但您可以使用php对其进行排序:
$result = $query->getResult();
$nomSort = function($a, $b) :int {
return strnatcmp($a->getNom(), $b->getNom());
}
usort($result, $nomSort);
// $result is now sorted
strnatcmp
将根据“自然排序”进行比较,即使添加了更多字母,该解释也将解释为“ 1” <“ 2” <“ 10” <“ 20”。
usort
可以将自定义排序函数应用于数组-这是必需的,因为您要访问数组元素(对象)的子元素(标称)。 -否则,您可能只用过natsort。
如果您出于任何原因确实需要对数据库进行排序,请查看以下相关问题:Natural Sort in MySQL(此处为mysql)