在laravel中,有没有办法对集合进行排序,忽略语言中的文章(例如a,an,in English; el,la in Spanish; etc。)?
我希望标题为jQuery Tablesorter,但我只能找到
How to sort an array with PHP, ignoring the articles (a, an, the) in the beginning?
和How to sort in SQL, ignoring articles ('the", "a', "an" etc)。
如果它是一个数组,那很好,但我有分页的集合,对分页结果进行排序是没有意义的,因为它只会对有限的结果进行排序而不是整个集合。
答案 0 :(得分:1)
@Alexey的答案确实解决了问题,如果你没有分页集合,因为我有分页,我通过使用orderByRaw()方法和正则表达式大小写匹配来解决问题。希望这可以帮助处于类似情况的人。
$query->orderByRaw("CASE
WHEN title REGEXP '^("a|an|the|el|la")[[:space:]]' = 1 THEN
TRIM(SUBSTR(title, INSTR(title, ' ')))
ELSE title
END ASC");
答案 1 :(得分:0)
您可以将闭包传递给sortBy()
或sortByDesc()
方法:
$collection->sortBy(function ($i) {
return trim(str_replace([' a ', ' an ', ' the ', ' el '], '', ' ' . $i['title'] . ' '));
});
此代码将在字符串的开头和结尾添加空格(即对象中的title
属性或集合中的数组)。然后它将删除文章,不会删除有''或者'' (或其中的一些其他文章)或以文章开头或结尾。然后它将从每个字符串的开头和结尾删除空格。然后它将返回一个已排序的集合。