isEmpty — コレクションが空かを判定する

  • カテゴリ: collection
  • 掲載バージョン: Laravel 12・PHP 8.4
  • 名前空間 / FQCN / コマンド: Illuminate\Support\Collection::isEmpty
  • 関連: isNotEmpty / first / count / whenEmpty / whenNotEmpty
  • 変更履歴: なし

要点(TL;DR)

  • コレクションに要素が 1件もない かを bool で判定する
  • 最低限の使い方:$items->isEmpty()
  • 罠:LazyCollection(cursor() 等)では 全件走査 になりがち/大規模データで重い/配列に対して呼ぶと「未定義メソッド」

概要

isEmpty はコレクションが空かどうかを簡潔にチェックするメソッドです。ガード句(早期 return)や 404 応答、処理分岐の条件に使われます。配列の empty($arr) 相当ですが、コレクションのチェーンの途中や Eloquent 取得結果に対して安全に使える点が実務で便利です。

構文 / シグネチャ

public function isEmpty(): bool
  • 引数
引数必須既定値説明
なし
  • 戻り値bool(空なら true、1件以上あれば false
  • 例外/副作用:例外なし。LazyCollection では内部的に件数計測のために走査が発生し、大規模データで I/O 負荷・時間増大の可能性あり。

使用例

最小例

<?php

use Illuminate\Support\Collection;

$items = collect([]);

if ($items->isEmpty()) {
    echo "empty\n"; // 出力: empty
}

実務例:該当がなければ 404

<?php

use App\Models\User;
use Illuminate\Http\Request;

Route::get('/active-users', function (Request $request) {
    $users = User::where('active', true)->get();

    abort_if($users->isEmpty(), 404, 'Active users not found.');

    return $users;
});

大規模データ(LazyCollection)での安全な判定

<?php

use App\Models\LogEntry;

// cursor() は LazyCollection。isEmpty() は全件走査になり得る。
// 先頭要素の有無だけを見たいなら first() を使うと早い。
$lazy = LogEntry::whereDate('created_at', today())->cursor();

if ($lazy->first() === null) {
    // 空
}

よくある落とし穴・注意

  • LazyCollection は全走査に注意cursor() などのストリーミング取得で isEmpty() は全件カウント相当。先頭有無判定なら first() === null を推奨。
  • 配列に対して呼べない[]->isEmpty() は不可。配列は collect($array)->isEmpty() か PHP の empty($array) を使う。
  • 「空」定義は要素数のみ[null] は空ではありません(false)。値の中身の空判定とは異なる点に注意。

コレクション特性(カテゴリ準拠)

  • チェーン可否:不可(bool を返すためチェーン終了)
  • 破壊的/非破壊:非破壊
  • キー保持:判定のみで変化なし
  • LazyCollection:可。ただし 計測のための走査が発生しやすい
  • 計算量の目安:通常の Collection(配列ベース)では O(1)LazyCollectionO(n)(件数計測相当)

入出力対応(小さなサンプル)

入力isEmpty()
空配列のコレクションcollect([])true
要素ありcollect([1])false
値が null の要素collect([null])false
Lazy(先頭のみ確認したい)cursor()->first() === null先頭が無ければ「空」相当

代替・関連APIとの比較

  • isNotEmpty():逆論理(空でなければ true)。読みやすさ重視で使い分け。
  • first():先頭要素を返す。Lazy 情報源では 早期判定に有効(first() === null)。
  • count():件数取得。条件分岐で count() === 0 でも同義だが、可読性は isEmpty() が上。
  • whenEmpty() / whenNotEmpty():空/非空時の処理をチェーンで分岐したい場合に便利。

テスト例(Pest)

<?php

use Illuminate\Support\Collection;

it('returns true for empty collection', function () {
    expect(collect()->isEmpty())->toBeTrue();
});

it('returns false for non-empty collection', function () {
    expect(collect([1])->isEmpty())->toBeFalse();
});

トラブルシュート(エラー別)

症状/エラー原因対処
Call to undefined method isEmpty()対象が 配列Paginator 等で、Collection ではないcollect($value)->isEmpty() に変換する/Paginator は count($paginator->items()) など対象型に合わせる
予想外に時間がかかるcursor() 等の LazyCollection を全走査先頭確認は first() === null、件数が必要なら集約前に条件を絞る・インデックス最適化
空なのに false が返る要素はあるが 値が空に見える(例:[null]「空=要素数0」であることを理解し、値の空判定は別途 filter() などで行う

参考リンク

レン (Wren)

こんにちは。レンです。

Laravelのコードの森に住んでいる、小さな案内役です。
ルーティングの枝やクラスの影を歩きながら、コードの流れや仕組みを眺めています。

このサイトでは、Laravelの基本から実装のコツまで、開発で役立つポイントを静かに整理しています。
難しいことを増やすのではなく、コードの見通しが少し良くなるヒントを届けるのが役目です。

「この処理はどこに書くのがいいのか」
「Laravelではどう考えると整理できるのか」

そんな疑問に、小さなメモを残すような気持ちで記事を書いています。

コードを書いている途中で迷ったとき、
このサイトが少し立ち止まって整理できる場所になればうれしいです。

レン (Wren)をフォローする