CollectionのgroupByを利用してブランド名の頭文字で
グループ分けしてみたらどうでしょうか。
$brands=DB::table('brands')->orderBy('name','asc')->get();
$brands = $brands->groupBy(function ($brand) {
// ブランド名の頭文字を取得
$initials = mb_substr($brand->name, 0, 1);
// アルファベットのグループ
if (ctype_alpha($initials)) {
// 先頭小文字の場合もあるため大文字に変換して判定する
return Str::upper($initials);
}
// 数字の場合「0-9」のグループ
if (is_numeric($initials)) {
return '0-9';
}
return 'その他';
});
$brands = collect(range('A', 'Z'))->push('0-9')
->push('その他')
->flip()
->map(function () { return null; })
->merge($brands);
0Like