【PHP初心者向け】配列関数(array関数)を使って配列操作をスマートに書こう!
みなさん、配列関数(array関数)、使っていますか?
配列操作と聞くと、なんとなくループ処理で書いてしまっている方もいるかもしれません。 ですが、多くの場合ループ処理より配列関数の方がスマートに書くことができ、可視性の向上、コーディング効率のアップに繋がります。
そんな配列関数の中でも、筆者がよく使うものをピックアップして紹介していきたいと思います。
INDEX
本記事で使用する環境
- PHP 7.4.14
array_chunk
$length の数値で $array の要素を分割した配列を返します。$array の要素のキーを保持したい場合は $preserve_keys を true にします。
array_chunk ( array $array , int $length , bool $preserve_keys = false ) : array
例)
<?php
$arr = ['Bulbasaur', 'Ivysaur', 'Venusaur', 'Charmander', 'Charmeleon', 'Charizard', 'Squirtle'];
print_r(array_chunk($arr, 3));
/*
Array
(
[0] => Array
(
[0] => Bulbasaur
[1] => Ivysaur
[2] => Venusaur
)
[1] => Array
(
[0] => Charmander
[1] => Charmeleon
[2] => Charizard
)
[2] => Array
(
[0] => Squirtle
)
)
*/
array_diff
$array の中で、第二引数以降の配列に含まれない要素を返します。返り値のキーは $array のものが保持されます。
array_diff ( array $array , array ...$arrays ) : array
例)
<?php
$arr = ['Caterpie', 'Metapod', 'Butterfree', 'Weedle', 'Kakuna', 'Beedrill'];
$arrays = [
['Caterpie', 'Butterfree'],
['Weedle', 'Beedrill']
];
print_r(array_diff($arr, ...$arrays));
/*
Array
(
[1] => Metapod
[4] => Kakuna
)
*/
array_intersect
$array の中で、第二引数以降の配列全てに含まれる要素を返します。返り値のキーは $array のものが保持されます。
array_intersect ( array $array , array ...$arrays ) : array
例)
<?php
$arr = [134 => 'Vaporeon', 'Jolteon', 'Flareon'];
$arr2 = ['Vaporeon', 'Jolteon'];
print_r(array_intersect($arr, $arr2));
/*
Array
(
[134] => Vaporeon
[135] => Jolteon
)
*/
array_flip
$array のキーと値を入れ替えます。array_flip ( array $array ) : array
例)
<?php
$arr = [
147 => 'Dratini',
148 => 'Dragonair',
149 => 'Dragonite'
];
print_r(array_flip($arr));
/*
Array
(
[Dratini] => 147
[Dragonair] => 148
[Dragonite] => 149
)
*/
array_key_exists
$key が $array に設定されているかどうかを Boolean で返します。array_key_exists ( string|int $key , array $array ) : bool
例)
<?php
$arr = ['Gible' => 443, 'Gabite' => 444, 'Garchomp' => 445];
var_dump(array_key_exists('Sharpedo', $arr));
var_dump(array_key_exists('Garchomp', $arr));
/*
bool(false)
bool(true)
*/
array_keys
$array のキーの配列を返します。array_keys ( array $array ) : array
第二引数を指定すると、指定した値を含むキーのみの配列を返します。
また、第三引数で厳密な比較を行うかどうかを指定できます。
array_keys ( array $array , mixed $search_value , bool $strict = false ) : array
例)
<?php
$arr = ['Dragonite', 'Tyranitar', 'Flygon', 'Garchomp', 'Haxorus'];
print_r(array_keys($arr));
/*
Array
(
[0] => 0
[1] => 1
[2] => 2
[3] => 3
[4] => 4
)
*/
print_r(array_keys($arr, 'Garchomp', true));
/*
Array
(
[0] => 3
)
*/
array_values
$array の値の配列を返します。array_values ( array $array ) : array
例)
<?php
$arr = [
149 => 'Dragonite',
248 => 'Tyranitar',
330 => 'Flygon',
445 => 'Garchomp',
612 => 'Haxorus'
];
print_r(array_values($arr));
/*
Array
(
[0] => Dragonite
[1] => Tyranitar
[2] => Flygon
[3] => Garchomp
[4] => Haxorus
)
*/
array_merge
前の配列に後ろの配列を要素をマージした配列を返します。
キーが数値の場合は新しくキーが振り直されますが、文字列の場合は後ろの値が前の値を上書きするので注意が必要です。
array_merge ( array ...$arrays ) : array
例)
<?php
$arr = [1, 5, 'strKey' => 'apple'];
$arr2 = ['a', 'b', 'strKey' => 'banana', 5];
print_r(array_merge($arr, $arr2));
/*
Array
(
[0] => 1
[1] => 5
[strKey] => banana
[2] => a
[3] => b
[4] => 5
)
*/
in_array
$haystack の値に $needle が含まれているかを Boolean で返します。第三引数を設定しない限りは型の比較が行われないので、基本的には true に設定しておくことをおすすめします。
in_array ( mixed $needle , array $haystack , bool $strict = false ) : bool
例)
<?php
$arr = [1, 2, '3', 'apple'];
var_dump(in_array(1, $arr, true));
var_dump(in_array('banana', $arr, true));
/*
bool(true)
bool(false)
*/
// 第三引数を設定しないとどちらもtrueになってしまう!
var_dump(in_array('3', $arr));
var_dump(in_array(3, $arr));
/*
bool(true)
bool(true)
*/
ここまでは、比較的動作が簡単な配列関数を紹介しました。 続けて少し複雑な配列関数の紹介と、配列関数のデメリットについて解説していきます。
array_column
多次元配列の特定のキーの配列を返します。
第三引数を指定すると、返り値のキーが指定した値になります。
また、第二引数を null にすることで、第三引数で指定した値をキーとした $array を返します。
DBから取得したデータにidのキーをもたせたい時によく使っています。
array_column ( array $array , int|string|null $column_key , int|string|null $index_key = null ) : array
例)
<?php
$arr = [
[
'id' => 144,
'en' => 'Articuno',
],
[
'id' => 145,
'en' => 'Zapdos',
],
[
'id' => 146,
'en' => 'Moltres',
]
];
// キーがenの配列を返す
print_r(array_column($arr, 'en'));
/*
Array
(
[0] => Articuno
[1] => Zapdos
[2] => Moltres
)
*/
// キーがenの値を、idがキーの配列として返す
print_r(array_column($arr, 'en', 'id'));
/*
Array
(
[144] => Articuno
[145] => Zapdos
[146] => Moltres
)
*/
// idをキーとした$arrを返す
print_r(array_column($arr, null, 'id'));
/*
Array
(
[144] => Array
(
[id] => 144
[en] => Articuno
)
[145] => Array
(
[id] => 145
[en] => Zapdos
)
[146] => Array
(
[id] => 146
[en] => Moltres
)
)
*/
array_map
$array に callback 関数を適用した配列を返します。array_map ( callable|null $callback , array $array , array ...$arrays ) : array
例)
<?php
function double($n) {
return $n * 2;
}
$arr = [1, 2, 3, 4, 5];
print_r(array_map('double', $arr));
/*
Array
(
[0] => 2
[1] => 4
[2] => 6
[3] => 8
[4] => 10
)
*/
array_filter
$array に callback 関数を適用し、 callback の結果が true の値のみの配列を返します。callbackがnull(デフォルト値)の場合、空(※1)のものが除外されます。
※1:empty()関数で検査されます
array_filter ( array $array , callable|null $callback = null , int $mode = 0 ) : array
例)
<?php
function between($n) {
return 1 <= $n && $n <= 151;
}
$arr = [-1, -2, 1, 90, 100, 151, 160, 200];
print_r(array_filter($arr, 'between'));
/*
Array
(
[2] => 1
[3] => 90
[4] => 100
[5] => 151
)
*/
array_reduce
$array の各要素に callback 関数を適用しひとつの値を返します。第三引数で callback に変数を渡すことができます。
array_reduce ( array $array , callable $callback , mixed $initial = null ) : mixed
例)
<?php
function sum($initial, int $val): int {
$initial += $val;
return $initial;
}
$arr = [1, 2, 3, 4, 5];
// 1 + 2 + 3 + 4 + 5 = 15
var_dump(array_reduce($arr, 'sum'));
/*
int(15)
*/
// 10 + 1 + 2 + 3 + 4 + 5 = 25
var_dump(array_reduce($arr, 'sum', 10));
/*
int(25)
*/
配列関数は遅い
関数呼び出しのため、同じロジックでも配列関数のほうが実行速度が遅くなる傾向があります。
案件によって、使い分けたほうが幸せになれるかもしれません。
例)array_push() VS $array[]=’hoge’
array_push()
<?php
$arr = [];
$st = microtime(true);
for($i=0; $i<10000; ++$i) {
array_push($arr, 'アネ゙デパミ゙');
}
$en = microtime(true);
echo ($en - $st). PHP_EOL;
$array[]=’hoge’
<?php
$arr = [];
$st = microtime(true);
for($i=0; $i<10000; ++$i) {
$arr[] = 'アネ゙デパミ゙';
}
$en = microtime(true);
echo ($en - $st). PHP_EOL;
ロジック | 実行時間 |
---|---|
array_push() | 0.0002739429473877 |
$array[]=’hoge’ | 0.00011491775512695 |
PHPマニュアルにも書かれていますが、ひとつの要素を加えるだけであれば $array[] = ‘hoge’ を使ったほうが良さそうですね。
例)array_map() VS foreach()
array_map()
<?php
$arr = range(1, 10000);
$st = microtime(true);
for($i=0; $i<10000; ++$i) {
array_map(
function($n) {
return $n * 2;
},
$arr
);
}
$en = microtime(true);
echo ($en - $st). PHP_EOL;
foreach()
<?php
$arr = range(1, 10000);
$st = microtime(true);
for($i=0; $i<10000; ++$i) {
foreach($arr as $key => $value) {
$arr[$key] = $value * 2;
}
}
$en = microtime(true);
echo ($en - $st). PHP_EOL;
ロジック | 実行時間 |
---|---|
array_map() | 3.5381228923798 |
foreach() | 2.2842841148376 |
10000 * 10000回の処理でこの結果ですので、よほど速度重視の案件で無い限り保守性を考えると array_map() で良いかなと思います。
さいごに
配列関数の紹介をしました。 システムの要件、保守性、可読性等々と相談しながらぜひ使ってみてはいかがでしょうか。
本記事で紹介したもの以外にも多くの配列関数が実装されています。 詳しくは下記のPHPマニュアルをご確認ください。
この記事を書いた人
-
東京で2年半エンジニアとしての経験を積み、浜松にUターンの後、アーティスへ入社。
ソリューション事業部のWebエンジニアとして、システムの設計・開発・保守・運用からインフラまで幅広く従事している。
フルスタックエンジニア目指して現在も勉強の日々。車が好き。
この執筆者の最新記事
関連記事
最新記事
FOLLOW US
最新の情報をお届けします
- facebookでフォロー
- Twitterでフォロー
- Feedlyでフォロー