php – empty() function returns false although array contains empty array-ThrowExceptions

Exception or error:

I am not sure why the desired row stating “No record found” is not displaying despite not having any data matching Selangor

BazaarLocController:

public function index()
    {
        $bzr = BzrLocation::where('area', 'Perlis')->get();
        $bzr2 = BzrLocation::where('area', 'Selangor')->get();
        $bzr3 = BzrLocation::where('area', 'Pahang')->get();
        $bzr4 = BzrLocation::where('area', 'Johor')->get();
        $bzr5 = BzrLocation::where('area', 'Melaka')->get();
        $bzr6 = BzrLocation::where('area', 'Negeri Sembilan')->get();

    $allbzr = [
        'bzrloc' => $bzr,
        'bzrloc2' => $bzr2,
        'bzrloc3' => $bzr3,
        'bzrloc4' => $bzr4,
        'bzrloc5' => $bzr5,
        'bzrloc6' => $bzr6
    ];

    return view('admin.bazaarloc')->with($allbzr);
   }

bazaarloc.blade.php:

<table class="table table-hover">
   <caption>Table 2</caption>
   <thead class="thead-dark">
     <tr>
       <th scope="col" style="width: 8%; vertical-align: top;">No.</th>
       <th scope="col" style="width: 60%; vertical-align: top;">Location</th>
       <th scope="col" style="width: 21%; vertical-align: top;">Amount Approved</th>
       <th scope="col" style="width: 21%; vertical-align: top;">Description</th>
       <th scope="col" style="width: 4%;"></th>
       <th scope="col" style="width: 4%;"></th>
     </tr>
   </thead>
   <tbody>
     @php
     $counting = 0
     @endphp
     @foreach($bzrloc2 as $bzr)
     @php
     $counting++
     @endphp
     <tr>
       <th scope="row">{{$counting}}</th>
       <td>{{$bzr->name}}</td>
       <td>{{$bzr->totalPlot}}</td>
       <td>{{$bzr->plotAvail}}</td>
       <td><a href="{{ route('bazaarLocation.edit', $bzr->bzrloc_id) }}"><button type="submit" class="btn btn-success btn-sm">Edit</button></a></td>
       <td>
         <form method="POST" action="{{ route('bazaarLocation.destroy', $bzr->bzrloc_id) }}">
             @csrf
             @method('DELETE')
             <button type="submit" class="btn btn-danger btn-sm" onclick="return confirm('Adakah anda pasti ingin membatalkan lokasi tersebut?')">Batal</button>
         </form>
       </td>
     </tr>
     @endforeach
     @if(empty($bzrloc2))
     <tr>
       <td colspan="2">
         No record found
       </td>
     </tr>
     @endif
   </tbody>
 </table>

When printing out $bzrloc2, it displays []. Which confirms the array is empty. Based on the php manual, the empty() function should consider this empty and return true.

How to solve:

Because you use collection, not array. Collection will return false :

empty(collect([]))  // false
empty([])           // true

Try following code :

<table class="table table-hover">
    <caption>Table 2</caption>
    <thead class="thead-dark">
        <tr>
            <th scope="col" style="width: 8%; vertical-align: top;">No.</th>
            <th scope="col" style="width: 60%; vertical-align: top;">Location</th>
            <th scope="col" style="width: 21%; vertical-align: top;">Amount Approved</th>
            <th scope="col" style="width: 21%; vertical-align: top;">Description</th>
            <th scope="col" style="width: 4%;"></th>
            <th scope="col" style="width: 4%;"></th>
        </tr>
    </thead>
    <tbody>
        @if($bzrloc2->count())
            @php
            $counting = 0
            @endphp
            @foreach($bzrloc2 as $bzr)
            @php
            $counting++
            @endphp
            <tr>
                <th scope="row">{{$counting}}</th>
                <td>{{$bzr->name}}</td>
                <td>{{$bzr->totalPlot}}</td>
                <td>{{$bzr->plotAvail}}</td>
                <td><a href="{{ route('bazaarLocation.edit', $bzr->bzrloc_id) }}"><button type="submit" class="btn btn-success btn-sm">Edit</button></a></td>
                <td>
                    <form method="POST" action="{{ route('bazaarLocation.destroy', $bzr->bzrloc_id) }}">
                        @csrf
                        @method('DELETE')
                        <button type="submit" class="btn btn-danger btn-sm" onclick="return confirm('Adakah anda pasti ingin membatalkan lokasi tersebut?')">Batal</button>
                    </form>
                </td>
            </tr>
            @endforeach
        @else
        <tr>
            <td colspan="2">
                No record found
            </td>
        </tr>
        @endif
    </tbody>
</table>

Answer´╝Ü

When you retrieve using ->get(), you should use count() function in order to check whether the Collection is empty or not.

Instead of using empty, try using count like:

@if($bzrloc2->count() < 1)
     <tr>
       <td colspan="2">
         No record found
       </td>
     </tr>
     @endif

Leave a Reply

Your email address will not be published. Required fields are marked *