在集合上使用in_array

时间:2016-06-29 16:16:18

标签: 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

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

@if(in_array($person, $ecn->signatures->name ))

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

@foreach($ecn->signatures as $signature)
{{ $signature->name }}<br>
@endforeach

一切都很好。

如何在此方案中访问并将签名列表作为数组传递?

3 个答案:

答案 0 :(得分:7)

如果您想将in_array()版本用于Laravel Collections,那么您可以使用:

$collection->contains($needle)

就像in_array一样。

答案 1 :(得分:4)

您可以使用签名集合上的listspluck方法获取所有名称的新集合。从那里,您可以在集合上使用contains()方法,也可以使用all()方法将集合转换为数组并直接使用in_array

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

阵列:

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

// blade
@if(in_array($person, $names))

收集:

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

// blade
@if($names->contains($person))

您还可以将contains()与闭包结合使用,这样可以避免创建中间集合,但这有点难以阅读:

包含封闭:

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

答案 2 :(得分:1)

根据Laravel Docs

  

SELECT schemaname,relname,n_live_tup FROM pg_stat_user_tables where relname like 'my_table_%' ORDER BY relname DESC ; 方法返回一个结果数组,其中每个结果都是PHP get对象的一个​​实例。

因此,您必须将stdClass对象转换为控制器本身的数组。

StdClass

然后您可以在刀片模板中使用in_array

foreach ($ecn->signatures as $signature) 
     $nameArray[] = $signature->name;