グローバルナビゲーションへ

本文へ

フッターへ

お役立ち情報Blog



【PHP初心者向け】配列関数(array関数)を使って配列操作をスマートに書こう!

みなさん、配列関数(array関数)、使っていますか?

配列操作と聞くと、なんとなくループ処理で書いてしまっている方もいるかもしれません。 ですが、多くの場合ループ処理より配列関数の方がスマートに書くことができ、可視性の向上、コーディング効率のアップに繋がります。

そんな配列関数の中でも、筆者がよく使うものをピックアップして紹介していきたいと思います。

本記事はPHP初心者向けの記事になります。

本記事で使用する環境

  • 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
 array_push() の方が倍以上遅いという結果でした。
PHPマニュアルにも書かれていますが、ひとつの要素を加えるだけであれば $array[] = ‘hoge’ を使ったほうが良さそうですね。

注意: もし配列にひとつの要素を加えるために array_push() を使用するなら、 関数を呼ぶオーバーヘッドがないので、$array[] = を使用するほうがいいです。 PHP: array_push - Manual

例)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
 array_map() の方が約1.5倍遅いという結果でした。
10000 * 10000回の処理でこの結果ですので、よほど速度重視の案件で無い限り保守性を考えると array_map() で良いかなと思います。

さいごに

配列関数の紹介をしました。 システムの要件、保守性、可読性等々と相談しながらぜひ使ってみてはいかがでしょうか。
本記事で紹介したもの以外にも多くの配列関数が実装されています。 詳しくは下記のPHPマニュアルをご確認ください。

この記事を書いた人

ばね
ばねソリューション事業部 システムエンジニア
東京で2年半エンジニアとしての経験を積み、浜松にUターンの後、アーティスへ入社。
ソリューション事業部のWebエンジニアとして、システムの設計・開発・保守・運用からインフラまで幅広く従事している。
フルスタックエンジニア目指して現在も勉強の日々。車が好き。
この記事のカテゴリ

FOLLOW US

最新の情報をお届けします