按数字对字符串数组进行排序

问题描述

我试图在Symfony中按名称对对象数组进行排序。但是我不知道该怎么做,因为字符串以数字开头,所以顺序不好。

我在存储库中尝试使用queryBuilder:

 $qb = $this->createqueryBuilder('arrondissement')
            ->addOrderBy('arrondissement.nom','ASC');
        $query = $qb->getQuery();
        return $query->execute();

还有控制器中的sort()函数

但是正如您所看到的,这并不完全是。我喜欢这样的东西:1er arrondissement,2e ....,20e ...,Paris

enter image description here

解决方法

例如,您可以使用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 
)
,

在这种情况下,恕我直言,您不应该通过PHP更改顺序,但为此使用数据库排序。

这是我的修改查询生成器的建议:

 $qb = $this->createQueryBuilder('arrondissement')
            ->add( 'orderBy','CAST(arrondissement.nom AS UNSIGNED),arrondissement.nom')
        $query = $qb->getQuery();
        return $query->execute();
,

在教义中,您无法轻易按自然顺序对字符串/对象进行排序。但您可以使用php对其进行排序:

$result = $query->getResult();
$nomSort = function($a,$b) :int {
    return strnatcmp($a->getNom(),$b->getNom());
}
usort($result,$nomSort);
// $result is now sorted

strnatcmp将根据“自然排序”进行比较,即使添加了更多字母,该解释也将解释为“ 1”

usort可以将自定义排序函数应用于数组-这是必需的,因为您要访问数组元素(对象)的子元素(标称)。 -否则,您可能只用过natsort。

如果您出于任何原因确实需要对数据库进行排序,请查看以下相关问题:Natural Sort in MySQL(此处为mysql)