在集合上使用in_array

CFr*_*ree 7 php laravel eloquent laravel-5.2

我需要检查名称数组中的名称,但无法将数组而不是集合传递给in_array()方法。

我的刀片代码看起来像这样

@foreach($ecn->areas as $area)
{{ $area->area }}:<br>
<ul>
    @foreach($area->people as $person)                              
        @if(in_array($person, $ecn->signatures->name ))
        <li><del>{{ $person }}</del></li>
        @else
        <li>{{ $person }}</li>
        @endif
    @endforeach
</ul>
@endforeach
Run Code Online (Sandbox Code Playgroud)

我知道我的问题在于尝试访问签名列表的方式。

@if(in_array($person, $ecn->signatures->name ))
Run Code Online (Sandbox Code Playgroud)

我可以在页面的另一部分访问它们

@foreach($ecn->signatures as $signature)
{{ $signature->name }}<br>
@endforeach
Run Code Online (Sandbox Code Playgroud)

一切都很好。

在这种情况下,如何访问签名列表并将其作为数组传递?

Has*_*imi 10

如果要in_array()为Laravel集合使用版本,则可以使用:

$collection->contains($needle)
Run Code Online (Sandbox Code Playgroud)

就像in_array

例如,如果$needle是整数,id则不要忘了先摘,就像这样:

$collection->pluck('id')->contains($needle)
Run Code Online (Sandbox Code Playgroud)


pat*_*cus 5

您可以在签名集合上使用listsor pluck方法来获取所有名称的新集合。从那里,您可以使用contains()集合上的方法,也可以使用该all()方法将集合变成数组并in_array直接使用。

我建议在foreach循环之外执行此操作,因此您不必每次迭代都生成此新的集合和数组。

数组:

// controller
$names = $ecn->signatures->lists('name')->all();

// blade
@if(in_array($person, $names))
Run Code Online (Sandbox Code Playgroud)

采集:

// controller
$names = $ecn->signatures->lists('name');

// blade
@if($names->contains($person))
Run Code Online (Sandbox Code Playgroud)

您还可以将其contains()与闭包一起使用,这将使您无需创建中间集合就可以摆脱困境,但阅读起来会有些困难:

包含闭包:

// blade
@if($ecn->signatures->contains(function ($key, $value) use ($person) {
    return $value->name == $person;
}))
Run Code Online (Sandbox Code Playgroud)