LoginSignup
0
1

More than 3 years have passed since last update.

[PHP] 複数のキーが配列に存在/必須を網羅しているか確認する

Last updated at Posted at 2020-06-12

受け取った配列が、必須のキーを網羅しているか確認したい。

「php 複数キー 配列 確認」で Qiita 記事をググっても、タイトルからわかるピンポイントの記事がなかったので、自分のググラビリティとして。

TL; DR

必須キーの配列を用意し、それを array_flip() でキーと値をフリップ(反転)したのち、array_diff_key() でキーの差で比べる。

if (array_diff_key(array_flip($keys_required), $data)) {
    echo '網羅していません';
}
  • 必須キー以外は認めない場合は TS; DR の末尾参照

TS; DR

<?php
// 必須のキーの配列
$keys_required = [
    'a',
    'b',
    'c',
];

// 受け取った配列
$data = [
    'a' => 'hoge',
    'b' => 'fuga',
    'c' => 'piyo',
    'e' => 'mogera',
];
echo array_diff_key(array_flip($keys_required), $data) ? '必須キーを網羅していません' : '必須キーを網羅しています', PHP_EOL;
// 結果: 必須キーを網羅しています

色々なパターン

必須キー
// 必須キー
$keys_required = [
    'a',
    'b',
    'c',
];
必須キーが足りないパターン
$data = [
    'a' => 'hoge',
    'b' => 'fuga',
];
echo array_diff_key(array_flip($keys_required), $data) ? 'NG' : 'OK', PHP_EOL;
//結果: NG
必須キーとピッタリ同じ
$data = [
    'a' => 'hoge',
    'b' => 'fuga',
    'c' => 'piyo',
];
echo array_diff_key(array_flip($keys_required), $data) ? 'NG' : 'OK', PHP_EOL;
// 結果: OK
必須キーとピッタリだが順番が違う
$data = [
    'c' => 'piyo',
    'b' => 'fuga',
    'a' => 'hoge',
];
echo array_diff_key(array_flip($keys_required), $data) ? 'NG' : 'OK', PHP_EOL;
// 結果: OK
必須キーとピッタリだが値が"null"
$data = [
    'a' => 'hoge',
    'b' => 'fuga',
    'c' => null,
];
echo array_diff_key(array_flip($keys_required), $data) ? 'NG' : 'OK', PHP_EOL;
// 結果: OK
必須キーは網羅しているが余計なキーも含む
$data = [
    'a' => 'hoge',
    'b' => 'fuga',
    'c' => 'piyo',
    'd' => 'mogera',
];
echo array_diff_key(array_flip($keys_required), $data) ? 'NG' : 'OK', PHP_EOL;
// 結果: OK
必須キーは網羅していないが、要素数は同じ
$data = [
    'a' => 'hoge',
    'b' => 'fuga',
    'e' => 'mogera',
];
echo array_diff_key(array_flip($keys_required), $data) ? 'NG' : 'OK', PHP_EOL;
// 結果: NG
必須キーは網羅しているが、値が"null"
$data = [
    'a' => 'hoge',
    'b' => 'fuga',
    'c' => null,   // null であってもキーがあればおk
    'd' => 'piyo',
];
echo array_diff_key(array_flip($keys_required), $data) ? 'NG' : 'OK', PHP_EOL;
// 結果: OK

必須キー以外は認めない

array_diff_key($a, $b)array_diff_key($b, $a) の差を array_merge() する。

必須のキーの配列
<?php

$keys_required = [
    'a',
    'b',
    'c',
];

// 受け取った配列
$data = [
    'a' => 'hoge',
    'b' => 'fuga',
    'c' => null,
];

$a = array_flip($keys_required);
$b = $data;
if (array_merge(array_diff_key($a, $b), array_diff_key($b, $a))) {
    echo '網羅していません';
}
必須キーが完全一致
$data = [
    'a' => 'hoge',
    'b' => 'fuga',
    'c' => null,
];
$keys_required_flipped =array_flip($keys_required);
echo array_merge(array_diff_key($keys_required_flipped, $data), array_diff_key($data, $keys_required_flipped)) ? 'NG' : 'OK', PHP_EOL;
// 結果: OK
必須キーが足りない
$data = [
    'a' => 'hoge',
    'b' => 'fuga',
];
$keys_required_flipped =array_flip($keys_required);
echo array_merge(array_diff_key($keys_required_flipped, $data), array_diff_key($data, $keys_required_flipped)) ? 'NG' : 'OK', PHP_EOL;
// 結果: NG
必須キーは網羅しているが要素数が多い
$data = [
    'a' => 'hoge',
    'b' => 'fuga',
    'c' => null,   // null
    'd' => 'piyo',
];
$keys_required_flipped =array_flip($keys_required);
echo array_merge(array_diff_key($keys_required_flipped, $data), array_diff_key($data, $keys_required_flipped)) ? 'NG' : 'OK', PHP_EOL;
// 結果: NG
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1