如何使用Laravel从名称中提取首字母

jdgnovmf  于 2023-11-20  发布在  其他
关注(0)|答案(7)|浏览(159)

我有下面的方法,返回我的注册用户列表:

$users = \App\Models\User::all();

字符串
事实证明,我只想介绍名单上名字的首字母。
范例:
卡洛斯佩雷拉多纳西曼托=CN
马科斯·奥雷利奥=
桑德拉·洛佩斯=SL
我如何从列表中获取这些数据?
我是否可以只取变量$ name的首字母来处理这个列表?

zfycwa2u

zfycwa2u1#

您可以使用Laravel的访问器来获取修改以下代码的缩写:

public function getInitialsAttribute(){
    $name = 'Carlos Pereira do Nascimento';
    $name_array = explode(' ',trim($name));

    $firstWord = $name_array[0];
    $lastWord = $name_array[count($name_array)-1];

    return $firstWord[0]."".$lastWord[0];
}

字符串
现在,您可以使用{{ $user->initials }}获取初始值

insrf1ej

insrf1ej2#

这样的东西应该工作:

$names = \App\Models\User::pluck('name');
$initials = [];
foreach($names as $name) {
    $nameParts = explode(' ', trim($name));
    $firstName = array_shift($nameParts);
    $lastName = array_pop($nameParts);
    $initials[$name] = (
        mb_substr($firstName,0,1) .
        mb_substr($lastName,0,1)
    );
}

var_dump($initials);

输出:

array(1) {
  ["Carlos Pereira do Nascimento"]=>
  string(2) "CN"
  ["Marcos Aurelio"]=>
  string(2) "MA"
  ["Émile Durkheim"]=>
  string(2) "ÉD"
}

注意使用mb_substr而不是常规的substr或字符串索引。这将返回以非ASCII字符开头的名称的正确值,例如“Émile”

echo substr('Émile Durkheim', 0, 1);
// output: b"Ã"
echo 'Émile Durkheim'[0];
// output: b"Ã"
echo mb_substr('Émile Durkheim', 0, 1);
// output: É

nbnkbykc

nbnkbykc3#

对于任何寻求简单、单行、与框架无关的解决方案的人来说:

$initials = preg_filter('/[^A-Z]/', '', $str);

字符串

oewdyzsn

oewdyzsn4#

我刚刚做了以下PR,在Laravel框架中引入了一个新的Str::initials() String助手函数:https://github.com/laravel/framework/pull/40381
对于那些已经想在接受/合并之前使用它的人,只需在AppServiceProviderboot()方法中使用这个宏扩展Illuminate\Support\Str

Str::macro('initials', fn($value, $sep = ' ', $glue = ' ') => trim(collect(explode($sep, $value))->map(function ($segment) {
            return $segment[0] ?? '';
        })->join($glue)));

字符串
然后只使用Str::initials('Foo Bar')或作为User模型中的Eloquent访问器:

public function getInitialsAttribute(): string
    {
        return \Illuminate\Support\Str::initials($this->name);
    }


所以你可以简单地使用像{{ Auth::user()->initials }}这样的东西。

kx5bkwkv

kx5bkwkv5#

只需输入这两行代码

function initials($str) {
         $ret = '';
         foreach (explode(' ', $str) as $word)
           $ret .= strtoupper($word[0]);
         return $ret;
    }

字符串

3vpjnl9f

3vpjnl9f6#

我只是想扩展上面的答案,以帮助其他人也这样做。
这里有一个关于我所做的事情的例子。
在用户模型中创建访问器:

public function getNameInitials()
{
    $name = $this->name;
    $name_array = explode(' ',trim($name));

    $firstWord = $name_array[0];
    $lastWord = $name_array[count($name_array)-1];

    return mb_substr($firstWord[0],0,1)."".mb_substr($lastWord[0],0,1);
}

字符串
然后,您可以在视图中以{{ $user->getNameInitials() }}的形式访问它,也可以轻松地访问已验证用户的姓名缩写,如下所示{{ Auth::user()->getNameInitials() }}

hec6srdp

hec6srdp7#

在2023年的今天,最优雅的方法是使用Laravel的Fluent String助手:

Str::of('John Doe Smith')
    ->explode(' ') // Split the name into parts
    ->map(fn($part) => Str::of($part)->substr(0, 1)->upper()) // Take the first letter and uppercase it
    ->join(''); // Join the initials together

字符串

相关问题