- カテゴリ: 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。issetはnullでfalse、array_key_existsはnullでも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 が常に false | has はドット記法非対応 | Arr::has($array, 'user.name') を使う |
null の項目があるのに true になる | has は値ではなくキー存在で判定 | 値の有無を判定したい場合は filled 相当のロジックや contains を検討 |
一部キーがあっても false | 複数キー配列はAND判定 | 一部一致で良いなら hasAny を使う |
参考リンク
- Laravel Docs — Collections(
has)
https://laravel.com/docs/12.x/collections - Laravel API —
Illuminate\Support\Collection
https://laravel.com/api/12.x/Illuminate/Support/Collection.html - Laravel Docs —
Illuminate\Support\Arr::has
https://laravel.com/docs/12.x/helpers#method-arr-has - PHP —
array_key_exists
https://www.php.net/array_key_exists
コレクション特性メモ(カテゴリ要件)
- チェーン可否:戻り値が
boolのためチェーン不可 - 破壊的/非破壊:非破壊
- キー保持:入力のキー前提で判定
- LazyCollection:利用可
- 計算量:O(m)(m=確認キー数)
- 入出力対応:入力=任意キー付きコレクション、出力=
bool

