这可能是一个典型的荷兰语问题,你的姓氏可以包含多个单词。例如罗宾·范佩西或马克·德容。
目前,我有一个按姓氏排序的用户列表,这是get_users
. 这在大多数情况下都可以正常工作,但当用户的姓氏包含多个单词时,就会失败。
例如,马克·德容(Mark de Jong)因“de”Jong而列在“C”和“E”之间。然而,应该在“I”和“K”之间列出is,因为Jong应该被视为要排序的单词。
罗宾·范佩西(RobinVanPersie)也是如此,他被列在“U”和“W”之间,因为他属于“范佩西”。然而,它应该列在“O”和“Q”之间,因为Persie应该被视为要排序的单词。
有没有办法为此创建一个函数来解决此问题?
编辑:使用当前代码更新:
$allUsers = get_users(\'orderby=display_name&order=ASC&exclude=1,4\');
$users = array();
// Remove subscribers from the list as they won\'t write any articles
foreach($allUsers as $currentUser)
{
if(!in_array( \'subscriber\', $currentUser->roles ))
{
$users[] = $currentUser;
}
}
usort($users, create_function(\'$a, $b\', \'return strnatcasecmp($a->last_name,
$b->last_name);\'));
foreach($users as $user)
{
// Output
提前感谢!
最合适的回答,由SO网友:Pat J 整理而成
这应该可以做到:
usort($users, \'wpse_235438_sort_users\' );
function wpse_235438_sort_users( $a, $b ) {
$a_last_name = array_pop( explode( \' \', $a->last_name ) );
$b_last_name = array_pop( explode( \' \', $b->last_name ) );
return strnatcasecmp( $a_last_name, $b_last_name );
}
explode()
将您的姓名转换为数组;
array_pop()
将为您提供这些数组中的最后一项,这就是您要查找的内容。然后你只需要做你已经在做的比较来对它们进行排序。
在上的PHP页面中使用匿名函数create_function()
, 如果您使用的是PHP 5.3或更新版本,那么应该使用anonymous function (或“关闭”)而不是create_function()
.
usort($users, function( $a, $b ) {
$a_last_name = array_pop( explode( \' \', $a->last_name ) );
$b_last_name = array_pop( explode( \' \', $b->last_name ) );
return strnatcasecmp( $a_last_name, $b_last_name );
} );
SO网友:Florian
我猜你真正的问题是“我怎样才能达到这个结果?”。
我将获取所有用户,将值粘贴到一个数组中,然后对该数组进行排序。
$names = array();
foreach($users as $user)
{
$names[] = $user->first_name.\' \'.$user->last_name;
}
usort($names, function($a, $b) {
$a = substr(strrchr($a, \' \'), 1);
$b = substr(strrchr($b, \' \'), 1);
return strcmp($a, $b);
});
var_dump($names);