has — 指定キーの存在を判定する

collection
  • カテゴリ: collection
  • 掲載バージョン: Laravel 12・PHP 8.4
  • 名前空間 / FQCN / コマンド: Illuminate\Support\Collection::has
  • 関連: hasAny / contains / keys / Illuminate\Support\Arr::has / data_get
  • 変更履歴: 既存機能(Laravel初期から概ね同等)

要点(TL;DR)

  • 何に使うか:コレクションに**特定のキー(index)**が存在するかを真偽で判定。
  • 最低限の使い方collect(['a' => 1])->has('a'); // true
  • よくある罠
    • 値の有無ではなくキーの有無を判定(nullでも存在すればtrue
    • ドット記法は不可(ネストはArr::hasを使う)
    • 複数キー配列を渡すとすべて存在でtrue(一部で良いならhasAny

概要

Collection::has はコレクションに指定したキーが存在するかを判定します。単一キーまたはキー配列を受け取り、配列の場合は 全キーが存在する時に true を返します。
フォーム入力の必須項目の存在確認、設定配列の項目チェックなど、キーの網羅確認に向いています。

構文 / シグネチャ

bool Illuminate\Support\Collection::has(string|int|array $key)
  • 引数(表) 引数 型 必須 既定値 説明 $key string|int|array はい なし 調べるキー。配列を渡すと「全てのキーが存在」で true
  • 戻り値bool(条件を満たせば true
  • 例外/副作用:特になし(非破壊

使用例

最小例

<?php

use Illuminate\Support\Collection;

$col = collect(['name' => 'Taylor', 'age' => null]);

var_dump($col->has('name'));      // true
var_dump($col->has('age'));       // true(値が null でもキーがあれば true)
var_dump($col->has('email'));     // false
var_dump($col->has(['name','age']));   // true(全て存在)
var_dump($col->has(['name','email'])); // false(email が無い)

実務例

<?php

use Illuminate\Http\Request;
use Illuminate\Support\Arr;

function buildUserDto(Request $request): array
{
    // 入力の必須キーがすべて存在するか(値のnullは許容)
    $payload = collect($request->all());

    if (! $payload->has(['name', 'email', 'profile'])) {
        // ネストが必要なら Arr::has でチェック(ドット記法)
        if (! Arr::has($request->all(), ['profile.bio'])) {
            abort(422, 'missing required keys');
        }
    }

    return [
        'name' => $payload->get('name'),
        'email' => $payload->get('email'),
        'bio' => data_get($payload, 'profile.bio'), // 値の取得は data_get が便利
    ];
}

よくある落とし穴・注意

  • 値の有無ではないisset($arr['age']) と違い、null でもキーがあれば true
  • ネストには非対応user.name のようなドット記法不可。ネストは Arr::has($array, 'user.name') を使用。
  • 複数キーはAND判定:配列を渡すと「すべて揃っているか」。一部で良いなら hasAny
  • 計算量:キーの直接参照のためO(m)(m=確認するキー数)。データサイズnに依存しにくい。
  • LazyCollection:概念的にキー存在判定は終端操作に近いが、LazyCollectionでも利用可(大量ストリームよりは通常コレクション向き)。

代替・関連APIとの比較

  • has:キーの存在(AND)。値は不問、nullでも可。
  • hasAny:複数キーのOR 判定。
  • contains(または条件)を含むか。キーではない。
  • Arr::has配列に対してドット記法でネストキーを判定。Eloquent属性配列などに有効。
  • isset / array_key_exists:生PHP。issetnullでfalse、array_key_existsnullでもtrue。hasは後者に近い。

テスト例(Pest)

<?php

use Illuminate\Support\Collection;

it('checks key existence including null values', function () {
    $c = collect(['a' => 1, 'b' => null]);

    expect($c->has('a'))->toBeTrue()
        ->and($c->has('b'))->toBeTrue()   // nullでもキーがあればtrue
        ->and($c->has('c'))->toBeFalse()
        ->and($c->has(['a','b']))->toBeTrue()
        ->and($c->has(['a','c']))->toBeFalse();
});

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

症状/エラー原因対処
ネストキー user.name が常に falsehas はドット記法非対応Arr::has($array, 'user.name') を使う
null の項目があるのに true になるhas は値ではなくキー存在で判定値の有無を判定したい場合は filled 相当のロジックや contains を検討
一部キーがあっても false複数キー配列はAND判定一部一致で良いなら hasAny を使う

参考リンク

コレクション特性メモ(カテゴリ要件)

  • チェーン可否:戻り値が bool のためチェーン不可
  • 破壊的/非破壊非破壊
  • キー保持:入力のキー前提で判定
  • LazyCollection:利用可
  • 計算量:O(m)(m=確認キー数)
  • 入出力対応:入力=任意キー付きコレクション、出力=bool

長野県・北アルプス地方在住のフリーランスWebプログラマー。
「落ち着くためのWeb開発」をテーマに、訪れる人が安心して使えるサービスづくりを心がけています。

LaravelやWordPressなどのWebアプリケーション開発を得意とし、技術面の安定性はもちろん、運用後も長く活用できる設計を大切にしています。
静かな山間の暮らしから生まれる視点で、シンプルかつ本質的な解決策をご提案します。

野鳥観察も趣味のひとつで、特にミソサザイ(Wren)に魅力を感じています。
小さな体に反して力強く上向きの尾羽、そして澄んだ鳴き声が遠くまで響く姿に、静かな存在感と芯の強さを感じます。
このサイト名「Laravel Wren」には、そんなミソサザイのように、小さくても確かな価値を届けたいという想いを込めています。

信頼できるパートナーとして、そして気軽に相談できる存在として、あなたのWebプロジェクトをサポートします。

Yudai Tsuyuzakiをフォローする