未知の配列 (ArrX) にキー 'abc' が存在するか

Write : 2006/01/02

例文説明

以下は、ある配列 array_x に key_str が存在するかどうかを返す is_key_exists 関数を定義し、配列にキーが存在するかどうかを確認している例文です。動作確認には次にあげる3つのケースを実施しています。

1.配列にキーが存在する場合の組み合わせ(該当データあり)
2.配列にキーが存在しなかった場合の組み合わせ(該当データなし)
3.そもそも配列でない値が指定された場合

例文ソースコード (PHP)

1: <?php
2:  
3:   // キー存在チェック関数
4:   function is_key_exists( $array_x, $key_str )
5:   {
6:     $result = false;
7:     if(is_array($array_x))
8:     {
9:       $result = array_key_exists( $key_str, $array_x );
10:     }
11:     return $result;
12:   }
13:   // 検索キーの定義
14:   $SKey = 'abc';
15:  
16:   // 配列を検索(該当データあり)
17:   $ArrX = array('a'=>'n1', 'ab'=>'n2', 'abc'=>'n3', 'abcd'=>'n4');
18:   if( is_key_exists($ArrX, $SKey ) )
19:   { print "KEY EXISTS<BR />"; } else { print "KEY_NOT_EXISTS<BR />"; }
20:  
21:   // 配列を検索(該当データなし)
22:   $ArrX = array('b'=>'n1', 'bc'=>'n2', 'bcd'=>'n3');
23:   if( is_key_exists($ArrX, $SKey ) )
24:   { print "KEY EXISTS<BR />"; } else { print "KEY_NOT_EXISTS<BR />"; }
25:  
26:   // 配列ではなく、文字列を指定した場合
27:   $ArrX = 'not array';
28:   if( is_key_exists($ArrX, $SKey ) )
29:   { print "KEY EXISTS<BR />"; } else { print "KEY_NOT_EXISTS<BR />"; }
30:  
31: ?>

スクリプト出力

上記スクリプトをページに埋め込んで表示すると以下の通りになります。

KEY EXISTS
KEY_NOT_EXISTS
KEY_NOT_EXISTS

例文解説

PHP スクリプトタグ(1行目/31行目)

1行目の <?php  から、31行目の  ?> で囲まれた部分が、PHP Script として処理される内容となります。

キー存在チェック関数(3行目~12行目)

3行目から12行目ではキー存在チェック関数として is_key_exists という名前の関数を定義しています。

6行目では、 $result = false; としてis_key_exists 関数が戻す値のデフォルト値を決めています。ここから、この関数の方針が 「基本的には『キーが存在しない(false)』を戻し、もし配列にキーが存在した場合は『キーが存在する(true)』を戻す」であると読み取れます。

7行目では、 is_array 関数を用いて 指定された配列 $array_x が本当に配列であるかをチェックしています。もし $array_x が配列であれば、9行目の処理に進み array_key_exists 関数で 指定された配列に指定されたキーが存在するかをチェックします。array_key_exists 関数は配列にキーが存在すれば true 存在しなければ false を戻します。

したがって、指定された配列 $array_x が配列であって、指定されたキーを持つ場合、$result の値は true で置き換えられます。

11行目では return $result; として、最終的な is_key_exists 関数の結果を戻しています。

キーチェック関数呼び出しテスト(13行目以降)

13行目以降では、上で定義した is_key_exists 関数がどのように動作するかを確認するためのサンプルスクリプトです。例としてチェック用の配列 $ArrX と 検索するキー $SKey を準備し、 is_key_exists($ArrX, $SKey) で確認。キーが存在すれば「KEY EXISTS」を存在しなければ「KEY_NOT_EXISTS」を出力するスクリプトを作成しました。

16行目から19行目が配列にキーが存在する場合の例、21行目から24行目が配列にキーが存在しない場合の例、26行目から29行目が配列でない値を指定した場合の例です。

例を3つあげましたが、検索キーはすべて "abc" にすると決めたのでまず最初(14行目)で $SKey = 'abc'; として定義しました。

キーが存在する場合、キーが存在しない場合、配列でない値を指定した場合と3つの例でそれぞれ1行ずつ処理結果を画面出力しています。ソースコードの下のスクリプトには出力のみが表示されていますが、順番に対応づけると以下の結果が得られたことがわかります。

1.配列にキーが存在する場合は true
2.配列にキーが存在しない場合は false
3.配列でない値に対してキーの検索を行おうとした場合は false

参考

単純にエラーを画面に出力したくないのであれば"@"を付加

PHP にはキー存在チェック関数 array_key_exists が組み込まれていて同じ働きをするのですが、万が一指定した配列が配列でなかった場合、array_key_exists 関数 は "The second argument should be either an array or an object" というエラーメッセージを出力します。配列が指定されるとわかっている場合は array_key_exists 関数をそのまま呼び出せばいいのですが、そもそも配列が指定されるかどうかも判らない場合には、関数を呼び出す前に配列であるかどうかもチェックしなければいけません。そのため独自に定義したのが上の is_key_exists という関数です。

単にエラーメッセージを表示させたくないのであれば、PHP では 文の先頭に "@" をつければエラー出力を表示しないこともできます。@$result = array_key_exists( $key_str, $array_x ); と記述してやることで、この文で発生したエラーは画面出力されなくなります。(set_error_handler でエラーを捕捉することは可能です。)

コードの記述量でもパフォーマンスの面でも "@" をつけてエラーを回避してしまった方が、効率が良いのかもしれませんが、想定外のエラーも回避してしまうので、私としてはあまりお勧めできません。他の言語にはないとても合理的な命令だとも思いますが・・。



  関連技術  
ネットワークとプロトコル
データ管理
RAID1
データ形式
拡張子(Extention)
CSV 形式
連想配列
W3Cによる日時表記
SEO
メニュー・見出し・タイトル
色彩・デザイン
モニタ・キャリブレーション
言語・環境
Java
Servlet/JSP
PHP
Objective-C
Excel関数
サポート
info@profaim.jp

PR
検索
カスタム検索