在laravel中,是否有一种忽略语言中的冠词(例如英语中的a,an,the;西班牙语中的el,la等)来排序集合的方法?我想要类似于jQuery Tablesorter这样的东西来对标题进行排序,但我只能找到如何使用PHP对数组进行排序,忽略开头的冠词(a,an,the)?和如何在SQL中进行排序,忽略冠词('the","a',"an"等)。如果只是一个数组的话还好,但我有带分页的集合,将分页结果排序没有意义,因为它只会对有限的结果进行排序而不是整个集合。
@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");
您可以将闭包传递给 sortBy()
或 sortByDesc()
方法:
$collection->sortBy(function ($i) {
return trim(str_replace([' a ', ' an ', ' the ', ' el '], '', ' ' . $i['title'] . ' '));
});
此代码将在字符串开头和结尾添加空格(例如对象中的title
属性或集合中的数组)。然后它将删除冠词,并且不会删除包含' an '或' the '(或其中某些其他冠词)的单词,也不会删除以冠词开头或结尾的单词。然后它将从每个字符串的开头和结尾删除空格。然后它将返回一个排序过的集合。