contains — コレクションに値/条件が含まれるか判定する

collection
  • カテゴリ: collection
  • 掲載バージョン: Laravel 12・PHP 8.4
  • 名前空間 / FQCN / コマンド: Illuminate\Support\Collection::contains
  • 関連: containsStrict / containsOneItem / has / where / filter
  • 変更履歴: —

要点(TL;DR)

  • 配列/オブジェクトの集合に特定の値条件を満たす要素があるかを bool で返す
  • 最低限: $collection->contains('status', 'active')
  • 罠: 「ゆるい比較(==)が既定」/like 等の演算子は不可→コールバックで対応/走査は O(n)(巨大データは注意)

概要

contains は、コレクション内に指定のが存在するか、または各要素が条件を満たすものがあるかを判定します。
単純な値一致、key = value 形式、key operator value 形式、任意ロジックのコールバックに対応。Eloquent モデルの属性比較にもそのまま使えます。

構文 / シグネチャ

bool contains(mixed $key, mixed $operator = null, mixed $value = null);
bool contains(Closure $callback);

引数(使い分け)

引数必須既定値説明
$valuemixed条件1引数で値一致(== 比較): contains(100)
$key, $valuestring/int, mixed条件2引数でキー=値一致: contains('status', 'active')
$key, $operator, $valuestring/int, string, mixed条件3引数で演算子比較: contains('age', '>=', 18)=, ==, !=, <, >, <=, >=, ===, !==
$callbackClosure($item, $key): bool条件任意ロジック。true を返した時点で true
  • 戻り値bool(少なくとも1件一致すれば true
  • 例外/副作用:例外なし/非破壊(チェーン不可)。早期終了あり。

使用例

最小例

<?php

use Illuminate\Support\Collection;

$numbers = collect([10, 20, 30]);

var_dump($numbers->contains(20));             // true(値一致)
var_dump($numbers->contains(25));             // false

$users = collect([
    ['id' => 1, 'status' => 'active',  'age' => 21],
    ['id' => 2, 'status' => 'inactive','age' => 17],
]);

var_dump($users->contains('status', 'active'));   // true(key=value)
var_dump($users->contains('age', '>=', 18));      // true(演算子)
var_dump($users->contains(fn ($u) => $u['id'] === 3)); // false(コールバック)

実務例(Eloquent 結果の確認)

<?php

use App\Models\User;
use Illuminate\Support\Carbon;

$users = User::query()
    ->select(['id', 'email', 'last_login_at', 'is_admin'])
    ->get();

// 1) 管理者が最低1人いるか
if (! $users->contains('is_admin', true)) {
    // アラートや初期化処理
}

// 2) 30日以上ログインなしのユーザーがいるか(任意ロジック)
$thirtyDaysAgo = Carbon::now()->subDays(30);
$hasDormant = $users->contains(function ($user) use ($thirtyDaysAgo) {
    return $user->last_login_at === null || $user->last_login_at->lt($thirtyDaysAgo);
});

// 3) 指定IDが含まれているか(型を厳密にしたい場合は containsStrict も検討)
$targetId = 123;
$included = $users->contains('id', $targetId);

よくある落とし穴・注意

  • ゆるい比較が既定contains(0)'0'false でも一致し得ます。厳密比較が必要なら contains('key','===',value)containsStrict を使用。
  • 演算子の種類like や正規表現は非対応。コールバックで記述してください。
  • 計算量:線形探索 O(n)。巨大コレクションでは先に keypluck してから in_array 相当で判定するなど最適化を検討。
  • Eloquent の属性アクセス:アクセサ等で型変換されるため、比較の厳密性が必要なら ===containsStrict を。
  • LazyCollection:対応可。短絡評価で一致したら停止するためストリーム処理と相性良。

代替・関連APIとの比較

  • containsStrict:厳密比較(===)で一致判定。型の取り違えを防ぎたいときに最優先。
  • has / hasAny:コレクションのキー(連想キー)存在判定。値の探索ではない点に注意。
  • where / filter:一致する要素の抽出。件数や実体が欲しいときに使い、存在確認だけなら contains が軽い。
  • PHP in_array:単純配列の値存在確認に速いが、key=value や演算子・コールバック比較は不可。

テスト例(Pest)

<?php

use Illuminate\Support\Collection;

it('checks presence by key and operator', function () {
    $c = collect([
        ['age' => 16],
        ['age' => 20],
    ]);

    expect($c->contains('age', '>=', 18))->toBeTrue();
    expect($c->contains('age', '>=', 30))->toBeFalse();
});

it('uses strict comparison when needed', function () {
    $c = collect(['0', 1, 2]);
    expect($c->containsStrict(0))->toBeFalse(); // '0' と 0 は別
});

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

症状/エラー原因対処
想定外に true になる既定がゆるい比較(==)で型が一致していないcontainsStrict=== 演算子の3引数形式を使用
like 相当の部分一致を判定したいcontains の演算子は限定的コールバックで Str::contains()preg_match を使用
重い/遅い大量データで毎回線形探索事前に pluck('id') して contains、もしくは DB 側で存在確認 (exists()

コレクション特性(カテゴリ追記)

  • チェーン可否:不可(bool で終了)
  • 破壊的/非破壊:非破壊
  • キー保持:N/A(値探索)
  • LazyCollection:対応(短絡評価)
  • 計算量:O(n)

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

入力呼び出し出力
[10,20,30]contains(20)true
[['age'=>16],['age'=>20]]contains('age','>=',18)true
[['name'=>'Ann'],['name'=>'Bob']]contains(fn($x)=>str_starts_with($x['name'],'A'))true

参考リンク

レン (Wren)

こんにちは。レンです。

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

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

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

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

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

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