配列がもっと便利になる!PHPの配列関連関数

プログラミングするにあたって配列はとても便利なものですが、PHPには配列をさらに便利にする関数が色々と定義されています。これらの関数を上手く利用することで、配列をより効率的に扱うことができます。

配列の要素数を返す count()

count()は、第1引数で渡した配列の要素数を返します。第2引数でCOUNT_RECURSIVEを指定すると多次元配列の要素数を再帰的にカウントすることができます。第2引数を省略、またはCOUNT_NORMALを指定した場合は、1次元の要素数のみをカウントします。

PHP

<?php
$array = array(
  'foo' => array(1, 2),
  'bar' => array(3, 4),
);
echo count($array), PHP_EOL; // 出力:2
echo count($array, COUNT_RECURSIVE), PHP_EOL; // 出力:6
?>

配列の要素が持つ値の出現回数をカウントする array_count_values()

array_count_values()は、引数で渡された配列の要素が持つ値の出現回数をカウントし、結果を連想配列で返します。返される連想配列では、元の配列の値がキーとなります。そのため、string型, int型以外の要素では、E_WARNINGが発生します。

PHP

<?php
$array = array(1, 'a', 1, 'b', 1, 'a');
$result = array_count_values($array);
print_r($result);
/* 出力:
Array
(
  [1] => 3
  [a] => 2
  [b] => 1
)
*/
?>

配列の要素に特定の値が存在するかを調べる in_array()

in_array()は、第2引数の配列の要素に第1引数の値が存在するかを調べます。戻り値はBoolean型で、存在する場合はtrue、存在しない場合はfalseとなります。第3引数は省略可能ですが、trueを指定した場合、配列の要素を調べる際に厳密な比較(===)が行われます。

PHP

<?php
$array = array('a', 'b', 'c');
$result = in_array('b', $array, true);
var_dump($result); // 出力:bool(true)
?>

配列の要素に特定の値が存在すれば、要素のキーを返す array_search()

array_search()は、in_array()と同じように第2引数の配列の要素に第1引数の値が存在するかを調べます。in_array()が結果をBool値で返すのに対して、array_search()は最初に見つかった要素のキーを返します。値が見つからなかった場合は、falseが返されます。第3引数に関してはin_arrayと同様です。

PHP

<?php
$array = array('a', 'foo' => 'b', 'c', 'b');
$result = array_search('b', $array, true);
var_dump($result); // 出力:string(3) "foo"
?>

配列に特定のキーが存在するかを調べる array_key_exists()

array_key_exists()は、第2引数の配列に第1引数で指定したキーが存在するかを調べます。キーが存在すればtrue、存在しなければfalseを返します。isset()を使っても調べることができますが、キーが存在していても値がnullの場合にisset()はfalseを返します。

PHP

<?php
$array = array(1, 'foo' => null, 'hoge' => 'a');
var_dump(array_key_exists(0, $array)); // 出力:bool(true)
var_dump(array_key_exists('bar', $array)); // 出力:bool(false)
var_dump(array_key_exists('foo', $array)); // 出力:bool(true)
var_dump(isset($array['foo'])); // 出力:bool(false)
?>

配列のキーを取得する array_keys()

array_keys()は、第1引数で渡した配列のキーを取得して配列で返します。第2引数に値を指定した場合、その値を持つ要素のキーだけを取得できます。第3引数では、要素の値を第2引数の値と比べる時に厳密な比較(===)を行うかをBool値で指定します。第2引数以降を省略した場合は、すべてのキーを取得できます。

PHP

<?php
$array = array(0, 'foo' => 1, 2, 'hoge' => 0);
$result = array_keys($array, 0, true);
var_dump($result);
/* 出力:
array(2) {
  [0]=>
  int(0)
  [1]=>
  string(4) "hoge"
}
*/
?>

配列のキーをランダムに取得する array_rand()

array_rand()を使うと第1引数で渡した配列のキーをランダムに取得することができます。第2引数で取得するキーの数を指定します。戻り値は、キーを1つ取得する場合はキーの値、複数取得する場合は、キーを格納した配列となります。

PHP

<?php
$array = array('foo' => 1, 2, 'hoge' => 3, 4, 'bar' => 5);
$keys = array_rand($array, 2);
print_r($keys);
/* 出力:(要素の値はランダムです。)
Array
(
  [0] => hoge
  [1] => 1
)
*/
?>

配列の要素を置換して結果を配列で返す array_replace()

array_replace()は、第1引数で渡した配列の要素を第2引数以降で渡した配列の同じキーを持つ要素で置換し、結果を配列で返します。第2引数以降では、配列を複数指定することができ、後に指定した配列の要素が優先されます。第1引数の配列に存在しないキーは、新たに追加されます。

PHP

<?php
$array1 = array('foo' => 'a', 'b', 'c', 'hoge' => 'd');
$array2 = array('foo' => 'e', 1 => 'f', 'hoge' => 'g');
$array3 = array('foo' => 'h', 'bar' => 'i');
$result = array_replace($array1, $array2, $array3);
print_r($result);
/* 出力:
Array
(
  [foo] => h
  [0] => b
  [1] => f
  [hoge] => g
  [bar] => i
)
*/
?>

配列の要素を別々の変数に代入する list()

list()を使うと配列の各要素をそれぞれ別々の変数に代入することができます。list()は関数のように見えますが、実際はarray()等と同じように言語構造です。下記のように記述することで配列内の要素が、それぞれ指定した変数に代入されます。

PHP

<?php
$array = array('a', 'b', 'c');
list($foo, $hoge, $bar) = $array;
echo $foo, PHP_EOL; // 出力:a
echo $hoge, PHP_EOL; // 出力:b
echo $bar, PHP_EOL; // 出力:c
?>

配列を変数として展開する extract()

extract()は、第1引数の配列を変数として展開します。その際、配列のキーが変数名、配列の要素が変数の値となります。第2引数では、変数名として無効なキーが存在した場合や既存の変数名と衝突した場合の展開方法を定数で指定します。第3引数では、第2引数で接頭辞を付ける指定をした場合の接頭辞を指定します。接頭辞は、元のキーとアンダースコアで区切られます。

第2引数では、下記の定数を指定することができます。デフォルト値は、EXTR_OVERWRITEで第2引数以降は省略可能です。

EXTR_OVERWRITE
既存の変数名と衝突した場合、上書きします。添字が数値の要素は展開しません。
EXTR_SKIP
既存の変数名と衝突した場合、展開しません。添字が数値の要素も展開しません。
EXTR_PREFIX_SAME
既存の変数名と衝突した場合、キーの先頭に接頭辞を付けて展開します。添字が数値の要素は展開しません。
EXTR_PREFIX_ALL
添字が数値の要素も含めて、すべてのキーの先頭に接頭辞を付けて展開します。接頭辞を付けたことで既存の変数名と衝突した場合、上書きします。
EXTR_PREFIX_INVALID
既存の変数名と衝突した場合、上書きします。添字が数値の要素のみ、キーの先頭に接頭辞を付けて展開します。
EXTR_IF_EXISTS
既存の変数名と衝突する場合のみ、展開して上書きします。添字が数値の要素は展開しません。
EXTR_PREFIX_IF_EXISTS
接頭辞を付けたキーが、既存の変数名と衝突する場合のみ、展開して上書きします。添字が数値の要素は展開しません。
EXTR_REFS
変数を参照として展開し、既存の変数名と衝突した場合は上書きします。添字が数値の要素は展開しません。他のextract_type定数と和算して組み合わせることもできます。

PHP

<?php
$foo = 1;
$array = array('foo' => 'a', 'hoge' => 'b', 0 => 'c');
$result = extract($array, EXTR_PREFIX_INVALID, 'my');
var_dump($result); // 出力:int(3)
echo $foo, PHP_EOL; // 出力:a
echo $hoge, PHP_EOL; // 出力:b
echo $my_0, PHP_EOL; // 出力:c
?>

変数から配列を作成する compact()

compact()は、extract()とは逆に変数から配列を作成します。引数として、配列に格納したい変数の変数名を列挙します。引数には、変数名を格納した配列を渡すこともできます。変数名として、未定義の変数を指定した場合は無視されます。作成される配列では、変数名がキー、変数の値が要素の値となります。

PHP

<?php
$foo = 1;
$hoge = 'a';
$bar = true;
$names = array('hoge', 'bar');
$result = compact('foo', $names, 'piyo');
var_dump($result);
/* 出力:
array(3) {
  ["foo"]=>
  int(1)
  ["hoge"]=>
  string(1) "a"
  ["bar"]=>
  bool(true)
}
*/
?>

キーを格納した配列と値を格納した配列で1つの配列を作成する array_combine()

array_combine()は、第1引数の配列をキー、第2引数の配列を値として1つの配列を作成して返します。第1引数の配列でキーとして無効な値があった場合は、文字列型にキャストされます。

PHP

<?php
$keys = array(0, 'foo', true, 'hoge', 2);
$values = array('a', 'b', 'c', 'd', 'e');
$result = array_combine($keys, $values);
print_r($result);
/* 出力:
Array
(
  [0] => a
  [foo] => b
  [1] => c
  [hoge] => d
  [2] => e
)
*/
?>

配列のキーと値を反転した新しい配列を返す array_flip()

array_flip()は、引数で渡された配列のキーと値を反転した新しい配列を返します。引数で渡す配列の値は、キーとして有効な値である必要があります。また、同じ値が存在した場合は、最後のキーが値となります。

PHP

<?php
$array = array(1, 'foo' => 'a', 2, 'hoge' => 'a');
$result = array_flip($array);
print_r($result);
/* 出力:
Array
(
  [1] => 0
  [a] => hoge
  [2] => 1
)
*/
?>

要素の初期値を指定して配列を作成する array_fill()

array_fill()は、第3引数で指定した値を要素の初期値として配列を作成します。第1引数で開始インデックス、第2引数で作成する要素数を指定します。

PHP

<?php
$array = array_fill(1, 3, '#FFFFFF');
print_r($array);
/* 出力:
Array
(
  [1] => #FFFFFF
  [2] => #FFFFFF
  [3] => #FFFFFF
)
*/
?>

要素のキーと初期値を指定して配列を作成する array_fill_keys()

array_fill_keys()は、array_fill()と同じように指定した値を要素の初期値として配列を作成しますが、array_fill_keys()では要素のキーも指定することができます。第1引数でキーの配列、第2引数で要素の初期値を指定します。

PHP

<?php
$keys = array('foo', 'hoge', 'bar');
$array = array_fill_keys($keys, 1);
print_r($array);
/* 出力:
Array
(
  [foo] => 1
  [hoge] => 1
  [bar] => 1
)
*/
?>

指定した値で指定した長さまで配列を埋める array_pad()

array_pad()は、第1引数で渡した配列の要素数が、第2引数で指定した長さになるまで第3引数の値で埋めた新しい配列を返します。第2引数で正の数値を指定した場合は配列の末尾側が埋められ、負の数値を指定した場合は配列の先頭側が埋められます。配列の要素数が第2引数以下の場合、処理は行われません。

PHP

<?php
$array = array(1, 2, 3);
$result = array_pad($array, 5, 0);
print_r($result);
$result = array_pad($array, -5, NAN);
print_r($result);
/* 出力:
Array
(
  [0] => 1
  [1] => 2
  [2] => 3
  [3] => 0
  [4] => 0
)
Array
(
  [0] => NAN
  [1] => NAN
  [2] => 1
  [3] => 2
  [4] => 3
)
*/
?>