如何根据首字母在视图中显示记录?

时间:2017-12-25 19:30:28

标签: laravel model-view-controller eloquent laravel-blade

在我的控制器中,我按字母顺序将一组类别传递给视图:

#include <stdio.h>    // printf(), sprintf()
#include <stdlib.h>   // rand(), srand()
#include <string.h>   // strcmp()
#include <time.h>     // time()


#define INFO_SIZE   3
#define MAX_ARR_LEN 20

int main( void )
{
    char arr[ MAX_ARR_LEN +1 ];

    struct st
    {
        char name[20+1];  // +1 to allow for trailing NUL byte
        int num;
    };

    struct st info[ INFO_SIZE ] =
    {
        { "some10",6 },
        { "some50",8 },
        { "some5",4  }
    };

    srand( (unsigned int)time( NULL ) );
    int r = (rand() % 41) + 10 ;
    sprintf( arr, "some%d", r );


    for(int j=0; j<INFO_SIZE; j++ )
    {
         if( strcmp( info[j].name, arr )  == 0 )
         {
             printf("found  %s  and it's num =%d",info[j].name,info[j].num);
         }
    }
}

在我看来,我希望在与这些类​​别中的字母表中的字母相对应的单独列中显示,因此在“A”列中,我将使用以A开头的所有类别,依​​此类推。

是否可以在视图中逐字过滤结果以实现此目的,如果是,可以如何完成?

3 个答案:

答案 0 :(得分:2)

您可以通过控制器中的第一个字母对类别列表进行分组,然后将结果传递给您的视图,具体操作方法如下:

<强>控制器:

public function index() {

    $categories = Category::orderBy('name', 'asc')->get();

    $groups = $categories->reduce(function ($carry, $category) {

        // get first letter
        $first_letter = $category['name'][0];

        if ( !isset($carry[$first_letter]) ) {
            $carry[$first_letter] = [];
        }

        $carry[$first_letter][] = $category;

        return $carry;

    }, []);

    return view('categories')->with('groups', $groups);
}

查看:

@foreach($groups as $letter => $group)

    <ul>

        <li>{{ $letter }}</li>

        @foreach($group as $category)

            <li>{{ $category['name'] }}</li>

        @endforeach

    </ul>

@endforeach

以下是使用example的工作array_reduce(它与上面的Collection::reduce功能相同)

答案 1 :(得分:1)

如果要仅使用指定的第一个字母从数据库加载类别:

$categories = Category::where('name', 'like', 'A%')->orderBy('name', 'asc')->get();

如果要加载所有类别然后过滤它们,请使用filter()方法:

@foreach ('ABCDEFGHIJKLMNOPQRSTUVWXYZ' as $letter)
    @foreach ($categories->filter(function($i) use($letter) { return starts_with($i->name, $letter); }) as $category)
        {{ $category->name }}
    @endforeach
@endforeach

答案 2 :(得分:1)

在您的视图中,而不是使用foreach使用for并有条件地检查每个当前项目的第一个字母及其上一个项目的第一个字符:

<h4>{{$categories[0]->name[0]}}</h4>
@for($i = 0; $i < count($categories); $i++)
   @if($i > 0 && $categories[$i]->name[0] != $categories[$i-1]->name[0])
    <h4>{{$categories[$i]->name[0]}}</h4>
   @endif
.....
@endfor

此解决方案中使用的另一个事实是,您可以通过该字符串中的索引访问字符串中的字符。即我们在类别名称字符串中通过其索引0访问了第一个字符。