从 PHP 数组中的全名获取缩写

Get Initials From Full Names In PHP Array

我想获取一个名称列表(来自 Wordpress)并获取首字母并用“/”分隔。在大多数情况下,会有 2 个或更多名称。在某些情况下,只有 1 个名称。

例如:

李四
简·亚当斯
迈克尔·麦克唐纳

应该输出: JD/JA/MD

这是我迄今为止尝试解决的方法。

foreach ( $result as $user )
{
   $user_id = $user->user_id1;
   $user = get_userdata( $user_id );
   $name[] = $user->display_name;
}
$comma_names =  implode('/', $name);

$words = explode("/", $comma_names);
    $initials = ""; 
    foreach ($words as $w) {
        $initials .= $w[0];
        
    }

 echo $initials;

显然,这只输出每个名字的第一个字母。我需要在我的循环中使用额外的爆炸吗?

最好的方法是什么?

假设 $words 是一个名称数组(您的代码不是 100% 清楚),您可以使用 preg_match_all 找到每个名称中的第一个字符,然后分解这些值以获得首字母字符串,然后再次内爆所有这些结果以获得所需的字符串。例如:

$words = array(
    'John Doe',
    'Jane Adams',
    'Michael McDonald',
    'Jim'
    );
    
$initials = implode('/', array_map(function ($name) { 
    preg_match_all('/\b\w/', $name, $matches);
    return implode('', $matches[0]);
}, $words));
echo $initials;

输出:

JD/JA/MM/J

Demo on 3v4l.org

如果保证名称之间只有一个 space,您可以简化该代码以仅替换名称字符串中前面是单词字符的任何字符:

$initials = implode('/', array_map(function ($name) { 
    return preg_replace('/(?<=\w)./', '', $name);
}, $words));

示例数据的输出相同。 Demo on 3v4l.org