Array操作にPHPを使用する場合、多くの開発者は、特にキー値がnullである場合、関数Array_key_exists()に混乱していますが、それでも真実です。この背後にある理由は、実際にはPHPアレイの作業メカニズムと密接に関連しています。
array_key_exists()の関数は、キーに値があるかどうかを検出するのではなく、指定されたキーがアレイに存在するかどうかを検出することです。これは、このキーが配列に存在する限り、その対応する値が何であれ(たとえそれがnullであっても)、関数が真実であることを意味します。
$array = ['name' => null];
if (array_key_exists('name', $array)) {
echo 'キーが存在します';
} else {
echo 'キーは存在しません';
}
上記のコードの出力は次のとおりです。
キーが存在します
これは、キー「名前」が配列に存在するためですが、その値はヌルです。
多くの初心者は、 array_key_exists()とisset()を混同し、値がnullの場合に動作が異なります。
$array = ['name' => null];
var_dump(isset($array['name'])); // 出力: bool(false)
var_dump(array_key_exists('name', $array)); // 出力: bool(true)
ISSET()は、変数がnullではなく設定されているかどうかを確認します。したがって、キーの値がnullである場合、 sistet()はfalseを返し、 array_key_exists()は、値に関係なくキーが存在するかどうかのみを気にします。
この動作の違いは、フォームデータが処理され、APIリクエスト、または「キーが存在しない」と「キーが存在し、値は空です」を区別する必要性があるシナリオでは非常に重要です。例えば:
// シミュレーション JSON ボディをリクエストします
$json = '{"username": null}';
$data = json_decode($json, true);
// ユーザーが明示的に提出した場合 null 価値,array_key_exists 識別できます
if (array_key_exists('username', $data)) {
// 対処する username,哪怕価値为 null
} else {
// username 送信されていないフィールド
}
このユースケースでは、 ISSET()を使用してユーザー名が存在するかどうかを検出した場合、ユーザーが意図的にnull値で渡されたかどうかはわかりません。これにより、いくつかの論理的判断に曖昧さが生じます。
構成配列があるとします。
$config = ['debug' => null];
if (isset($config['debug'])) {
echo 'デバッグモードをオンにします';
}
この判断は、値がnullの場合にfalseを返すため、この判断は失敗しますが、実際には、このキーが存在するかどうかを知りたいだけかもしれません。より正確なアプローチは次のとおりです。
if (array_key_exists('debug', $config)) {
echo 'デバッグモードをオンにします';
}
キーが存在し、値のコンテンツを処理するかどうかを知りたい場合は、両方と組み合わせて使用できます。
if (array_key_exists('token', $data)) {
if ($data['token'] !== null) {
// 効率的 token
$token = $data['token'];
} else {
// token はい null,再検証またはプロンプトが必要になる場合があります
}
} else {
// token フィールドはまったく渡されません,可能はい非法请求
}
array_key_exists()の動作は非常に合理的に設計されています。値の状態ではなく、キーの存在に焦点を当てています。これを理解することは、堅牢なPHPプログラムを作成するために不可欠です。
デバッグ中にキーが実際に配列に存在するかどうかをさらに確認する必要がある場合、その値がnullであっても、 array_key_exists()を使用することが正しい選択です。誤用ISSET()を避けてキーの存在を決定します。そうしないと、明示的にnullに設定されているキー値を無視できます。これは、複雑なビジネスロジック( gitbox.netのAPI設計など)を扱うときに特にエラーが発生しやすいです。