PHP | 配列、連想配列で値の検索方法と役立つサンプルまとめ

Code:

// 単体
($key || false) = array_search(値, 配列, 型の比較[true OR false]);
// 単体
$bool = in_array(値, 配列, 型の比較[true OR false]);
// 複数
($keys || []) = array_keys(配列, 値);
// 単体
$array = [
	'a',
	'b',
	'c',
];
$array = array_fill_keys($array, 1);
$bool = isset($array['a']);
配列内の要素の検索を行う方法は幾つかあります。
それぞれの使い方、使いどころをサンプルを交えて紹介していきます。

    もくじ

  1. 使い方
  2. 使いどころ
  3. まとめ

使い方

array_searchで検索

Code:

$array = [
	'a',
	'b',
	'c',
	'd',
	'b',
];
$key = array_search('b', $array, true);

Result:

int(1)
array_searchで検索すると、検索値のkeyを取得することが出来ます。
指定の要素がなければ、falseを返します。
指定要素が配列内に複数あった場合は、一番最初のkeyだけを返します。
余程の理由がない限りは第三引数にtrueをしましょう。
※ 連想配列でも同様にkeyが返ります。

in_arrayで検索

Code:

$array = [
	'a',
	'b',
	'c',
	'd',
	'b',
];
$bool = in_array('b', $array, true);

Result:

bool(true)
in_arrayで検索すると、検索値があるかどうかを、trueまたは、falseで返します。
array_searchより幾分早い?
純粋に検索値があるかどうかの確認をする際に使えます。
余程の理由がない限りは第三引数にtrueをしましょう。
※ 連想配列でも同様にtrueまたは、falseが返ります。

array_keysで検索

Code:

$array = [
	'a',
	'b',
	'c',
	'd',
	'b',
];
$keys = array_keys($array, 'b');

Result:

array(2) {
  [0]=>
  int(1)
  [1]=>
  int(4)
}
array_keysで検索すると、array_searchと同様に、検索値のkeyを取得することが出来ます。
array_searchとの違いは、検索値が配列内に複数あった場合、全てのkeyを返してくれるところです。
指定の要素がなければ、空の配列が返ります。
※ 一見、array_searchの上位互換のような振る舞いをしてくれますが、型検索(===)をしてくれず、検索値に「0」を指定した場合などは、全てのkeyが返ってきてしまうので、注意が必要です。
※ 連想配列でも同様にkeyが返ります。

Code:

$array = [
	'a',
	'b',
	'c',
	'd',
	'b',
];
$keys = array_keys($array, 0);

Result:

array(5) {
  [0]=>
  int(0)
  [1]=>
  int(1)
  [2]=>
  int(2)
  [3]=>
  int(3)
  [4]=>
  int(4)
}
array_keysを使用する際は、注意が必要です。

連想配列にしてissetで検索

Code:

$array = [
	'a',
	'b',
	'c',
];
$array = array_fill_keys($array, 1);
$bool = isset($array['a']);

Result:

bool(true)
配列をarray_fill_keysを用いて連想配列に変換して、issetで検索します。
元からある配列の検索には使いにくいですが(array_fill_keysを実行する分、遅くなる)、配列を生成する段階で連想配列にしておけば、手間なく検索可能です。
検索の速度も早い。型検索どうのとか考えなくもていい。素晴らしい!

使いどころ

array_searchを使い、配列から値を削除

Code:

$array = [
	'a',
	'b',
	'c',
	'd',
	'b',
];
$key = array_search('b', $array, true);
// $key = int(1)
unset($array[$key]);

Result:

array(4) {
  [0]=>
  string(1) "a"
  [2]=>
  string(1) "c"
  [3]=>
  string(1) "d"
  [4]=>
  string(1) "b"
}
array_searchで対象となる値の検索を行い、返ってきたkeyを元に、unsetで値を削除します。
array_searchで検索にも書いた通り、検索した値が複数ある場合は、初めの値しか返してくれないため、注意が必要です。
削除したい要素が複数ある場合は、複数回実行するか、array_keysを使う必要があります。

まとめ

今回は配列、連想配列の値の検索方法の解説となりました。
array_searchin_arrayは第三引数にtrueを指定し、型での検索もしないと予期せぬ動作をするので、必ず指定するようにしましょう。
array_keysで数値(0)の検索をする場合は要注意。
個人的には、連想配列のissetまたは!emptyが好きです。