【PHP】連想配列に一つまたは複数のキーが存在しているか確認する方法

更新日:2023/09/21

PHPで配列にキーが存在するかどうかを確認する方法をお伝えします。
さらに複数のキーの全てが存在しているかどうかについても紹介します。

 

キーが存在しているの確認

連想配列に特定のキーが存在しているか確認したいときは、array_key_exists()を使用します。

他にisset()を使用する方法があります。これは少し使いにくい面があります。
詳しくは後述

構文は、次のようになっています。

bool array_key_exists( キー , 配列 )

配列にキーが存在するならtrueを、そうでないならfalseを返します。

$array = [ 'a' => 1 , 'b' => 2 ];

echo array_key_exists('a',$array) ? 
        'キーが存在します' : 'キーが存在しません';
// 結果: 'キーが存在します'

echo array_key_exists('c',$array) ? 
        'キーが存在します' : 'キーが存在しません';
// 結果: 'キーが存在しません'

普通の配列もarray_key_exists()でインデックスの存在を確認できます。
インデックス指定は数値・文字列、どちらでもOKです。

$array = [  'a' , 'b' , 'c' ];
unset( $array[1] );

echo array_key_exists(0,$array) ? 
        'キーが存在します' : 'キーが存在しません';
// 結果: 'キーが存在します'

echo array_key_exists(1,$array) ? 
        'キーが存在します' : 'キーが存在しません';
// 結果: 'キーが存在しません'

echo array_key_exists('2',$array) ? 
        'キーが存在します' : 'キーが存在しません';
// 結果: 'キーが存在します'

■isset()もキー存在を確認できる

isset()でもキーの存在確認ができます。
ただし値がnull値のときは、結果がfalseになります。

$array = [ 'a' => 1 , 'b' => null ];

echo isset($array['a']) ? 
        'キーが存在します' : 'キーが存在しません';
// 結果: 'キーが存在します'

echo isset($array['b']) ? 
        'キーが存在します' : 'キーが存在しません';
// 結果: 'キーが存在しません'

echo isset($array['c']) ? 
        'キーが存在します' : 'キーが存在しません';
// 結果: 'キーが存在しません'

値がnull値のときは、キーが存在していても存在しないと判断されます。
null値に意味を持たせているときは、isset()を使用できませんね。

 

複数のキーが全て存在しているの確認

配列に複数の特定キーが全て存在しているかの確認方法は、いくつか考えられます。
今回はarray_diff_key()を使用する方法を紹介します。

構文は、次のようになっています。

array array_diff_key( 比較元配列 , 比較対象配列 )

比較元配列のキーで比較対象配列に存在しないものを、配列で返します。

今回は、次のような関数を作成しました。

// 配列に複数の特定キーが全て存在するか確認する
// $keysArray: キー名の配列
// $array: 確認対象の配列
// return: true 全て存在する
//         配列 存在しないキー
function array_multiple_keys_exists($keysArray,$array){
    $result = array_diff_key( array_flip($keysArray) , $array );
    return $result ? array_values(array_flip($result)) : true;
}

array_flip()は、配列の値とキーを入れ替えます。
これでarray_diff_key()での比較が可能になります。

array_diff_key()の結果を返すときは、結果配列の値とキーを入れ替えます。
これで、キー名を値とする配列になります。
その際インデックスが飛び番になっている可能性があるので、振り直しています。

次のコードは、作成した関数の使用例です。

$array = [ 'a' => 1 , 'b' => 2 ,'c' =>3 ];

$r = array_multiple_keys_exists(['a','b','c'],$array);
echo $r === true ? 'ok' : 'キー['.implode(',',$r).']が存在しません';
// 結果: 'ok'

$r = array_multiple_keys_exists(['a','b','z'],$array);
echo $r === true ? 'ok' : 'キー['.implode(',',$r).']が存在しません';
/ 結果: 'キー[z]が存在しません'

 

2次元配列の複数キーを確認する

名簿データなど特定のキーを持つ配列をメンバーに持つ2次元配列で、子要素のキーチェックを行いたい時があります。

このような確認を行う関数を作成しました。
基本的には2次元配列のメンバーを前項の関数でチェックするだけです。

// 全ての子要素配列に複数の特定キーが全て存在するか確認する
// $keysArray: キー名の配列
// $array: 確認対象の配列
// return: true 全て存在する
//         配列 キーが足りない要素データの配列 [['index'=>インデックス,'keys'=>足りないキー],...]
function array_member_multiple_keys_exists($keysArray,$array){
    $flip = array_flip($keysArray);
    $result = [];

    foreach( $array as $index => $value ){
        if( !is_array($value) )continue;

        $r = array_diff_key( $flip , $value );
        if( $r ) $result[] = ['index'=>$index,'keys'=>array_values(array_flip($r))];
    }
    return count($result) === 0 ? true : $result;
}

次のコードは、作成した関数の使用例です。

function resultList( $r ){
    return 'NG:[' .implode(',',array_map(function($e){
                return $e['index'].'=>['.implode(',',$e['keys'] ).']';
            },$r)).']';
}

$array = [ 
    ['name' => 'taro' , 'age' => 20 ,'address' =>'xxx' ],
    ['name' => 'hanako' , 'age' => 20 ,'address' =>'xxx' ],
    ['name' => 'jiro' , 'age' => 20 ,'address' =>'xxx' ],
];

$r = array_member_multiple_keys_exists(['name','age','address'],$array);
var_dump($r);
// 結果: true

unset( $array[1]['address'] );
unset( $array[2]['name'] ,$array[2]['age']);

$r = array_member_multiple_keys_exists(['name','age','address'],$array);
var_dump($r);
// 結果:array(2) {
//   [0]=>array(2) {
//     ["index"]=>int(1)
//     ["keys"]=>array(1) {[0]=>string(7) "address"}
//   }
//   [1]=>array(2) {
//     ["index"]=>int(2)
//     ["keys"]=>array(1) {[0]=>string(4) "name" [1]=>string(3) "age"}
//  }
//}

めんどくさくなったので、var_dump()してます…

更新日:2023/09/21

書いた人(管理人):けーちゃん

スポンサーリンク

記事の内容について

null

こんにちはけーちゃんです。
説明するのって難しいですね。

「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。

裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。

掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。

ご意見、ご指摘はこちら。
https://note.affi-sapo-sv.com/info.php

 

このサイトは、リンクフリーです。大歓迎です。