【问题标题】:Laravel blade check empty foreachLaravel 刀片检查空 foreach
【发布时间】:2015-12-15 15:36:20
【问题描述】:

我想检查我的 foreach 是否为空,因此基本的 html 标记不会显示,内部没有结果。我试图将它包装在 if 语句中,然后如果它为空,则不执行任何其他循环 foreach。

@if ($status->replies === '')

@elseif
<div class="media-body reply-body">
    @foreach ($status->replies as $reply)
        <p>{{ $reply->body }}</p>
    @endforeach
</div>
@endif

@if (!(empty($status->replies))
<div class="media-body reply-body">
    @foreach ($status->replies as $reply)
        <div class="media">
            <a class="pull-left" href="{{ route('profile.index', ['username' => $reply->user->username]) }}">
                <img class="media-object" alt="{{ $reply->user->getNameOrUsername() }}" src="{{ $reply->user->getAvatarUrl() }}">
            </a>
            <div class="media-body">
                <h5 class="media-heading"><a href="{{ route('profile.index', ['username' => $reply->user->username]) }}">{{ $reply->user->getNameOrUsername() }}</a></h5>
                <p>{{ $reply->body }}</p>
                <ul class="list-inline list-replies">
                    <li>
                        <a href="{{ route('status.like', ['statusId' => $reply->id]) }}"><i class="fa fa-thumbs-up"></i></a>
                    {{ $reply->likes->count() }} {{ str_plural('like', $reply->likes->count()) }}</li>
                    <li>{{ $reply->created_at->diffForHumans() }}</li>
                </ul>
            </div>
            <hr>
        </div>
    @endforeach
</div>
@endif

【问题讨论】:

  • 如果$status-&gt;replies 为空,为什么不使用empty() 进行测试?...@if (empty($status-&gt;replies)) 而不是假设如果它为空,它将是一个字符串?

标签: php laravel foreach


【解决方案1】:

使用以下代码,可以首先使用 laravel 指令的 @isset 检查变量是否设置,然后使用 laravel 指令的 @unless 来检查数组是否为空

@if(@isset($names))
    @unless($names)
        Array has no value
    @else
        Array has value

        @foreach($names as $name)
            {{$name}}
        @endforeach

    @endunless
@else
    Not defined
@endif

【讨论】:

    【解决方案2】:

    如果我能很好地理解这个问题,这是我最好的解决方案:

    使用$object-&gt;first() 方法运行if 语句中的代码一次,即在第一个循环时。 $object-&gt;last() 也是同样的概念。

        @if($object->first())
            <div class="panel user-list">
              <table id="myCustomTable" class="table table-hover">
                  <thead>
                      <tr>
                         <th class="col-email">Email</th>
                      </tr>
                  </thead>
                  <tbody>
        @endif
    
        @foreach ($object as $data)
            <tr class="gradeX">
               <td class="col-name"><strong>{{ $data->email }}</strong></td>
            </tr>
        @endforeach
    
        @if($object->last())
                    </tbody>
                </table>
            </div>
        @endif
    

    【讨论】:

      【解决方案3】:

      查看documentation 以获得最佳结果:

      @forelse($status->replies as $reply)
          <p>{{ $reply->body }}</p>
      @empty
          <p>No replies</p>
      @endforelse
      

      【讨论】:

      • 它可能已经过时了,但是天哪,我现在有很多代码要重写!我不知道这存在!
      • 这个人的黄金答案!
      • 顺便说一句,这不适用于渲染表格,因为你会得到一个没有行(或单行)的表格,里面有一个 para - 而你需要的是根本没有表格加上一个对
      【解决方案4】:

      如果存在则回显数据

      有时您可能希望回显一个变量,但您不确定该变量是否已设置。我们可以像这样用冗长的 PHP 代码来表达这一点:

      {{ isset($name) ? $name : 'Default' }}
      

      但是,Blade 并没有编写三元语句,而是为您提供了以下便捷的捷径:

      {{ $name or 'Default' }}
      

      在本例中,如果 $name 变量存在,将显示其值。但是,如果它不存在,则会显示默认字样。

      来自https://laravel.com/docs/5.4/blade#displaying-data

      【讨论】:

      • 现在 Laravel 需要 PHP 7.1,你可以使用空合并运算符:{{ $name ?? 'Default'}} (“或”运算符在 Laravel 5.6 中已弃用)
      【解决方案5】:

      你应该使用 empty()

      @if (!empty($status->replies)) 
      
      <div class="media-body reply-body">
          @foreach ($status->replies as $reply)
              <p>{{ $reply->body }}</p>
          @endforeach
      </div>
      
      @endif
      

      可以使用count,但是如果数组越大,需要的时间越长,如果只需要知道它是否为空,最好使用空。

      【讨论】:

      • 感谢您使用此方法的回答我收到以下错误 - syntax error, unexpected ':', expecting '('
      • 用完整代码更新了第一篇文章,当我删除 if 语句时,我们刚刚添加了页面加载,发现没有错误:S
      • 如果您从 foreach 中删除所有内容,仍然会出现错误?
      • 如果$status 是一个集合,用empty() 检查将不起作用,它总是返回true。您必须使用$status-&gt;isEmpty()$status-&gt;count()count($status) 之一。
      【解决方案6】:

      我认为您正在尝试检查数组是否为空。您可以这样做:

      @if(!$result->isEmpty())
           // $result is not empty
      @else
          // $result is empty
      @endif
      

      参考isEmpty()

      【讨论】:

      • 并不总是可以使用@forelse(例如用于呈现非空表)。也不能将@empty(甚至empty($collection)!)与空集合一起使用。您建议的解决方案仍然是最后的手段!谢谢!
      【解决方案7】:

      这是一个数组,所以==== '' 不起作用(=== 表示它必须是一个空字符串。)

      使用count() 识别数组是否有任何元素(count 返回一个数字,1 或更大将评估为 true,0 = false。)

      @if (count($status->replies) > 0)
       // your HTML + foreach loop
      @endif
      

      【讨论】:

        猜你喜欢
        • 2015-02-13
        • 2017-06-20
        • 2018-04-04
        • 2021-10-19
        • 1970-01-01
        • 2017-11-13
        • 2019-05-12
        • 2016-06-29
        • 2020-05-19
        相关资源
        最近更新 更多