1. Home
  2. PHP
  3. Basics
  4. PHPで配列操作を行う関数まとめ

PHPで配列操作を行う関数まとめ

  • 公開日
  • 更新日
  • カテゴリ:Basics
  • タグ:PHP,Basics,Array
PHPで配列操作を行う関数まとめ

PHP で WEB アプリケーションを構築していくにあたり配列の操作は必要不可欠ですが、配列を扱う関数はたくさんあり、それら個々の処理内容も微妙な違いであったり、引数によって処理ががらりと変わったりと、わかりにくいものや、便利なのにたくさんあるからこそ埋もれてしまっている関数もたくさんあります。

今回は、PHP で配列操作を行う関数を見ていきます。

Contents

  1. 開発環境
  2. range
  3. count
  4. array_pad
  5. list
  6. array_slice
  7. array_chunk
  8. array_keys
  9. array_values
  10. array_combine
  11. array_key_exists
  12. array_splice
  13. extract
  14. compact
  15. array_walk
  16. array_reduce
  17. in_array
  18. array_search
  19. array_sum
  20. array_merge
  21. array_diff
  22. array_filter
  23. array_unique
  24. array_intersect
  25. array_push
  26. array_pop
  27. array_shift
  28. array_unshift

開発環境

今回のデモは PHP7.2 で行っていますが、紹介しているものは基本的に全てのバージョンで使用できる関数です。使用できるバージョンが限定的な場合はセクション毎にアナウンスします。

range

range関数は、指定した範囲で値を生成し配列として格納します。

array range ( mixed $start , mixed $end [, number $step = 1 ] )

第一引数に範囲の開始値、第二引数に範囲の終了値を渡します。また、オプションで第三引数にステップを指定できます。ステップを渡すと、指定範囲内をステップで刻んで値を生成します。

$array = range(3, 9); // 3 から 9 までを生成
var_dump($array);
//  0 => int 3
//  1 => int 4
//  2 => int 5
//  3 => int 6
//  4 => int 7
//  5 => int 8
//  6 => int 9

$array = range(0, 12, 3); // 0 から 12 までを 3 ステップで生成
var_dump($array);
//  0 => int 0
//  1 => int 3
//  2 => int 6
//  3 => int 9
//  4 => int 12

後者の例、オプションを指定した場合は数値が3刻みで生成されている事が確認できます。

また、数値だけでなく文字列の生成も行えます。

$array = range("A", "Z"); // アルファベット A から Z までを生成
var_dump($array);
//  0 => string 'A'
//  1 => string 'B'
//  2 => string 'C'
//  3 => string 'D'
//  4 => string 'E'
//  5 => string 'F'
//  6 => string 'G'
//  7 => string 'H'
//  8 => string 'I'
//  9 => string 'J'
//  10 => string 'K'
//  11 => string 'L'
//  12 => string 'M'
//  13 => string 'N'
//  14 => string 'O'
//  15 => string 'P'
//  16 => string 'Q'
//  17 => string 'R'
//  18 => string 'S'
//  19 => string 'T'
//  20 => string 'U'
//  21 => string 'V'
//  22 => string 'W'
//  23 => string 'X'
//  24 => string 'Y'
//  25 => string 'Z'

$array = range("abc", "xyz"); //複数文字列の場合は最初の文字列のみを使って範囲を生成
var_dump($array);
//  0 => string 'a'
//  1 => string 'b'
//  2 => string 'c'
//  3 => string 'd'
//  4 => string 'e'
//  5 => string 'f'
//  6 => string 'g'
//  7 => string 'h'
//  8 => string 'i'
//  9 => string 'j'
//  10 => string 'k'
//  11 => string 'l'
//  12 => string 'm'
//  13 => string 'n'
//  14 => string 'o'
//  15 => string 'p'
//  16 => string 'q'
//  17 => string 'r'
//  18 => string 's'
//  19 => string 't'
//  20 => string 'u'
//  21 => string 'v'
//  22 => string 'w'
//  23 => string 'x'

渡した文字列が複数ある場合は、最初の文字列のみを使って範囲を生成します。

ちなみに range関数は日本語には使えません。

count

count関数は、指定した配列が保持する値の数を返します。

int count ( mixed $array_or_countable [, int $mode = COUNT_NORMAL ] )

第一引数にカウントする配列を渡します。オプションで第二引数にカウント処理方式を指定できます。

また、sizeof()関数は count() のエイリアスです。

$array = [1, 2, 3, 4, 5, 6, 7, 8];

var_dump( count($array) );
// => 8

var_dump( sizeof($array) );
// => 8

オプションに関してですが、設定値は以下になります。

  • COUNT_NORMAL
    • デフォルト。通常のカウント。
  • COUNT_RECURSIVE(もしくは「1 」)」
    • 再帰的に配列をカウントする。つまりは、連想配列などを子も含めカウントしたい場合は処理方式を切り替える事でカウントが可能になります。
$multi_array = [
    'one' => [
        '01', '11', '21'
    ],
    'two' => [
        '02', '22', '22'
    ],
    'three' => [
        '03', '33', '33'
    ]
];

var_dump( count($multi_array) ); // 第一階層のみカウントされます
// => 3

var_dump( sizeof($multi_array) );
// => 3

var_dump( count($multi_array, COUNT_RECURSIVE) ); // 再帰的にカウントされます
// => 12

var_dump( sizeof($multi_array, COUNT_RECURSIVE) );
// => 12

count関数について一点、注意すべき点があります。

PHP 7.2 から、countable ではない型を渡すと E_WARNING が発生するようになりました。つまり、ただの結果セットコレクション(オブジェクト)を渡すとエラーが出ます。

count関数ではスカラー変数は扱えないのは以前からの仕様として、扱う事の出来る形式は、以下になります。

  • 配列
  • Countable インターフェイスを実装しているオブジェクト

PHP 7.2 へアップグレードした際に上手くアプリケーションが走らない場合は意外とここでつまづいている事もあるので、アップグレード前に確認しておく事をお勧めします。

array_pad

array_pad関数は、指定した配列に対して、指定サイズになるまで指定範囲値でインデックスを埋めます。

array array_pad ( array $array , int $size , mixed $value )

第一引数には対象となる配列を、第二引数には拡充する配列のサイズを、第三引数には配列を埋める値のセットを渡します。

尚、第二引数に渡す値は、正の数で後ろ埋めとなり、負の数を渡すと前埋めになります。

print_r( array_pad($array, 5, 0) ); // 配列サイズが 5 になるように 0 を「後ろ」に挿入
// => Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 0 [4] => 0 )

print_r( array_pad($array, -5, 7) ); // 配列サイズが 5 になるように 7 を「前」に挿入
// => Array ( [0] => 7 [1] => 7 [2] => 1 [3] => 2 [4] => 3 )

print_r( array_pad($array, 5, "ABC") ); // 文字列でも埋められます
// => Array ( [0] => 1 [1] => 2 [2] => 3 [3] => ABC [4] => ABC )

print_r( array_pad($array, 5, null) ); // null でも埋められます
// => Array ( [0] => 1 [1] => 2 [2] => 3 [3] => null [4] => null )

埋めた値には 0 からの数値インデックスが振られます。この規則は一貫されるので、例えば文字列キーを持つ配列を渡すと以下のようになります。

$array = [
    'aaa' => "AAA",
    'bbb' => 'BBB',
    'ccc' => 'CCC'
];
print_r( array_pad($array, 5, "ABC") );
// => Array ( [aaa] => AAA [bbb] => BBB [ccc] => CCC [0] => ABC [1] => ABC )

キーが混在してよくわからない感じになるのであまりおすすめできません。

ちなみに、一回の処理で追加可能な要素の最大数は 1048576 個になります。

list

list() は、対象配列を指定変数へアタッチします。

array list ( mixed $var1 [, mixed $... ] )

引数にはアタッチする為の変数を必要分渡します。

$array = ["PHP", "MySQL", "Python"];

list($php, $mysql, $python) = $array;

var_dump($php);
// => 'PHP'

var_dump($mysql);
// => 'MySQL'

var_dump($python);
// => 'Python'

また、アタッチは配列の値を引数で指定した変数へ順に行われるので、カンマのみで変数の指定を省く事で、不要なアタッチは行われません。つまりは変数へアタッチしたい値を制御する事が出来ます。

list($string01, , $string03) = $array; // 2つ目はスキップします。

var_dump($string01);
// => 'PHP'

var_dump($string03);
// => 'Python'

尚、対象配列と指定変数それぞれの指定数が異なった場合、指定変数の方が多ければ余った変数には null がセットされ、少ない場合は残りの値のアタッチはスキップされます。

$array = ["PHP", "MySQL", "Python"];

// 指定変数の方が数が多い場合は null がセットされます。
list($php, $mysql, $python, $java) = $array;

var_dump($php);
// => 'PHP'

var_dump($mysql);
// => 'MySQL'

var_dump($python);
// => 'Python'

var_dump($java);
// => null


$array = ["PHP", "MySQL", "Python"];

// 指定変数の方が数が少ない場合は、残りの値のアタッチがスキップされます。
list($php, $mysql) = $array;

var_dump($php);
// => 'PHP'

var_dump($mysql);
// => 'MySQL'

ちなみに、list() は、PHP7.0 までは文字列キーの場合は動作しません。

$array = ["PHP" => 7.2, "MySQL" => 8.0, "Python" => 3.7]; // 文字列添字の配列では動作しません

list($php_version, $mysql_version, $python_version) = $array;

var_dump($php_version);
// => null

var_dump($mysql_version);
// => null

var_dump($python_version);
// => null

PHP7.1 以降は、以下のようにする事で、文字列キーの場合でも取り出せるようになりました。

$array = ["PHP" => 7.2, "MySQL" => 8.0, "Python" => 3.7];

list('PHP' => $php_version, 'MySQL' => $mysql_version, 'Python' => $python_version) = $array;

var_dump($php_version);
// => 7.2

var_dump($mysql_version);
// => 8.0

var_dump($python_version);
// => 3.7

一つ注意点として、list() は PHP5 系と 7 系で挙動が違います。 5 系では対象配列に対して逆順でアタッチされていましたが、PHP7 になり配列にセットされている順にアタッチされるようになりました。

$array = ["Laravel", "Symfony", "cakePHP", "ZendFramework"];
$php = [];

list($php[0], $php[1], $php[2], $php[3]) = $array;

print_r($php);

// PHP 7.x
// => Array
//  (
//    [0] => Laravel
//    [1] => Symfony
//    [2] => cakePHP
//    [3] => ZendFramework
//  )

// PHP 5.x
// => Array
//  (
//    [0] => ZendFramework
//    [1] => cakePHP
//    [2] => Symfony
//    [3] => Laravel
//  )

list() は、厳密には関数ではありません。つまりは array() と同じ言語構造という扱いになります。

ちなみに PHP7.1 より、配列の短縮構文を用いて list() と同じように配列の値を取り出す事ができるようになっています。

$array = ["Laravel", "Symfony", "cakePHP", "ZendFramework"];

[$fw1, $fw2, $fw3, $fw4] = $array;

var_dump($fw1);
// => Laravel
var_dump($fw2);
// => Symfony
var_dump($fw3);
// => cakePHP
var_dump($fw4);
// => ZendFramework

array_slice

array_slice関数は、対象配列から指定範囲の値を取得します。

array array_slice ( array $array , int $offset [, int $length = NULL [, bool $preserve_keys = FALSE ]] )

第一引数に対象配列を、第二引数に取得する範囲の開始インデックス番号を渡します。

オプションとして、第三引数には「開始インデックスから何個取得するか」を、第四引数にはキー処理方式を指定できます。

$array = ['AAA', 'BBB', 'CCC', 'DDD', 'EEE'];

print_r( array_slice($array, 3) ); // 3 番目以降を取得します
// => Array ( [0] => DDD [1] => EEE )

print_r( array_slice($array, 0, 2) ); // 0 番目から 2 つ取得します
// => Array ( [0] => AAA [1] => BBB )

取得した配列はキーが振り直されますが、第四引数に true をセットすればキーの振り直しは行われなくなります。

print_r( array_slice($array, 2, 2) ); // キーは振り直されます
// => Array ( [0] => CCC [1] => DDD )

print_r( array_slice($array, 2, 2, true) ); // キーは振り直されません
// => Array ( [2] => CCC [3] => DDD )

尚、array_slice() で対象配列内の要素を取得する際はコピーされるので、対象配列から要素は削除されません。

array_chunk

array_chunk関数は、対象配列を指定数に分割します。

array array_chunk ( array $array , int $size [, bool $preserve_keys = FALSE ] )

第一引数に対象となる配列を、第二引数には分割数を渡します。オプションで第三引数にキー処理方式を渡せます。

$array = ['AAA', 'BBB', 'CCC', 'DDD', 'EEE', 'FFF', 'GGG', 'HHH', 'III'];

print_r( array_chunk($array, 4) ); // 4 つに分解する
// Array
//(
//    [0] => Array
//        (
//            [0] => AAA
//            [1] => BBB
//            [2] => CCC
//            [3] => DDD
//        )
//    [1] => Array
//        (
//            [0] => EEE
//            [1] => FFF
//            [2] => GGG
//            [3] => HHH
//        )
//    [2] => Array
//        (
//            [0] => III
//        )
//)

また、対象配列が文字列キーの場合はインデックスキーに振り直されます。これを保持する為には、オプションである第三引数に true を渡します。

// 添字は振り直されます(デフォルト)
print_r( array_chunk($array, 2) );
// Array
//(
//    [0] => Array
//        (
//            [0] => AAA
//            [1] => BBB
//        )
//
//    [1] => Array
//        (
//            [0] => CCC
//            [1] => DDD
//        )
//
//    [2] => Array
//        (
//            [0] => EEE
//        )
//
//)

// 添字は保持されます
print_r( array_chunk($array, 2, true) );
// Array
//(
//    [0] => Array
//        (
//            [aaa] => AAA
//            [bbb] => BBB
//        )
//
//    [1] => Array
//        (
//            [ccc] => CCC
//            [ddd] => DDD
//        )
//
//    [2] => Array
//        (
//            [eee] => EEE
//        )
//
//)

array_keys

array_keys関数は、対象配列のキーを取得します。

array array_keys ( array $array [, mixed $search_value = NULL [, bool $strict = FALSE ]] )

第一引数に対象配列を渡します。オプションとして、第二引数に取得対象となる値、第三引数に型比較の是非を渡せます。

$array = [
    'aaa' => 111,
    'bbb' => 222,
    'ccc' => 333,
    'ddd' => 444,
    'eee' => 222,
];

var_dump( array_keys($array) ); // 全てのキーを取得
//  0 => string 'aaa'
//  1 => string 'bbb'
//  2 => string 'ccc'
//  3 => string 'ddd'
//  4 => string 'eee'

var_dump( array_keys($array, 222) ); // value 値が「222 」のキーを取得
//  0 => string 'bbb'
//  1 => string 'eee'


var_dump( array_keys($array, '444') ); // デフォルトでは型比較は行われません
// => 'ddd'

var_dump( array_keys($array, '444', true) ); // 型比較が行われます
// => empty(空配列)

array_values

array_values関数は、配列の全 value 値を返します。

array array_values ( array $array )

引数は一つだけ、対象となる配列を渡します。

$array = [
    'aaa' => 111,
    'bbb' => 222,
    'ccc' => 333,
    'ddd' => 444,
    'eee' => 222,
];

var_dump( array_values($array) );
//  0 => int 111
//  1 => int 222
//  2 => int 333
//  3 => int 444
//  4 => int 222

array_combine

array_combine関数は、2つの配列から一つの key-value を持つ配列を作成します。

この関数は PHP5 PHP7 で使用できます。

array array_combine ( array $keys , array $values )

第一引数に key とする配列を、第二引数に value とする配列を渡します。

$key    = ['name', 'category', 'version', 'license'];
$value  = ['Laravel', 'PHP', '5.7', 'MIT'];

print_r( array_combine($key, $value) );
// Array
//(
//    [name] => Laravel
//    [category] => PHP
//    [version] => 5.7
//    [lisense] => MIT
//)

array_key_exists

array_key_exists関数は、対象配列に対して、指定したキーが配列に存在するかどうかを返します。

bool array_key_exists ( mixed $key , array $array )

第一引数に調べるキーを、第二引数には調査する配列を渡します。

$array = [
    'aaa' => 0,
    'bbb' => 1,
    'ccc' => 2,
];

var_dump( array_key_exists('aaa', $array) );
// => true

var_dump( array_key_exists('ddd', $array) );
// => false

array_key_exists 関数では、あくまでも「そのキー自体が存在するか」を返すので、value 値がどうであれ、キー自体が存在すれば true を返します。つまり isset() や empty() などとは本質的に判定対象が違う事を理解する必要があります。

array_splice

array_splice 関数は、対象配列について、指定範囲を取り出し、置換を行います。

array array_splice ( array &$input , int $offset [, int $length = count($input) [, mixed $replacement = array() ]] )

第一引数に対象配列を、第二引数に取り出す開始インデックス番号を渡します。オプションとして、第三引数に取り出す範囲の値を、第四引数には置換する値を渡せます。

$array = [
    'aaa' => 111,
    'bbb' => 222,
    'ccc' => 333,
    'ddd' => 444,
    'eee' => 555,
];

var_dump( array_splice($array, 3)); // 3 番目以降を取り出します
//  'ddd' => int 444
//  'eee' => int 555

var_dump( array_splice($array, 1, 2)); // 1 番目から 2 つ取り出します
//  'bbb' => int 222
//  'ccc' => int 333

var_dump($array); // 元の配列からも取り除かれます
// 'aaa' => int 111

取り出した部分を新しい値で埋めます。

$array = [1, 2, 3, 4, 5];
$replace = [33, 44];

var_dump( array_splice($array, 2, 2, $replace)); // 取り出し部分を置換文字で埋める
//  0 => int 3
//  1 => int 4

var_dump($array);
//  0 => int 1
//  1 => int 2
//  2 => int 33
//  3 => int 44
//  4 => int 5

値の追加のみを行う場合は、第三引数に0を渡します。

$array = [5, 6];

$add1 = [7, 8];

array_splice($array, 3, 0, $add1);
//  empty

var_dump($array);
//  0 => int 5
//  1 => int 6
//  2 => int 7
//  3 => int 8

$add2 = [1, 2];

array_splice($array, 0, 0, $add2);

var_dump($array);
//  0 => int 1
//  1 => int 2
//  2 => int 5
//  3 => int 6
//  4 => int 7
//  5 => int 8

$add3 = [3, 4];

array_splice($array, 2, 0, $add3);

var_dump($array);
//  0 => int 1
//  1 => int 2
//  2 => int 3
//  3 => int 4
//  4 => int 5
//  5 => int 6
//  6 => int 7
//  7 => int 8

extract

extract関数は、対象配列の値をキーに対応した配列へアタッチします。

int extract ( array &$array [, int $flags = EXTR_OVERWRITE [, string $prefix = NULL ]] )

第一引数に対象の配列を渡します。オプションで第二引数に無効、もしくは衝突時の処理を定義する定数をセットできます。第三引数には、第二引数にセットする定数によって接頭辞を渡せます。

$array = ["PHP" => 7.2, "MySQL" => 8.0, "Python" => 3.7];

extract($array);

var_dump($PHP);
// => 7.2

var_dump($MySQL);
// => 8.0

var_dump($Python);
// => 3.7

尚、extract関数は、デフォルトでは文字列キーの配列のみに動作します。つまり、数値キーを持つ配列の場合、処理は行われません。

$array = [1, 2, 3];
var_dump( extract($array) );
// => 0

数値キーを持つ配列に適用させるには、定数 EXTR_PREFIX_INVALID をセットし、接頭辞を渡します。

$array = [1, 2, 3];
extract($array, EXTR_PREFIX_INVALID, 'prefix');

var_dump($prefix_0);
// => 1

var_dump($prefix_1);
// => 2

var_dump($prefix_2);
// => 2

既に同名の変数がある場合、デフォルトでは上書きされます。

$abc = 'abc';
$def = 'def';

$array = ['abc' => 'ABC', 'def' => 'DEF'];

extract($array);

var_dump($abc);
// => 'ABC'

var_dump($def);
// => 'DEF'

定数 EXTR_SKIP をセットすると、衝突があった場合に上書きは行われません。

$abc = 'abc';
$def = 'def';

$array = ['abc' => 'ABC', 'def' => 'DEF'];

extract($array, EXTR_SKIP);

var_dump($abc);
// => 'abc'

var_dump($def);
// => 'def'

処理時に全ての変数に接頭辞を付与する事も出来ます。こうする事で、予め衝突を防ぐ事が出来ます。

$abc = 'abc';
$def = 'def';

$array = ['abc' => 'ABC', 'def' => 'DEF'];

extract($array, EXTR_PREFIX_ALL, 'prefix');

var_dump($prefix_abc);
// => 'ABC'

var_dump($prefix_def);
// => 'DEF'

var_dump($abc);
// => 'abc'

var_dump($def);
// => 'def'

extract関数でセットできる定数は以下の通りです。

  • EXTR_OVERWRITE
    • 衝突時は上書きされます。デフォルトです。
  • EXTR_SKIP
    • 衝突時は上書きされません。
  • EXTR_PREFIX_SAME
    • 衝突時は第三引数でセットした接頭辞が付与されます。
  • EXTR_PREFIX_ALL
    • アタッチする全ての変数に接頭辞が付与されます。
  • EXTR_PREFIX_INVALID
    • 数値キーの場合に接頭辞を付与します。
  • EXTR_PREFIX_IF_EXISTS
    • 同じ変数だけどプレフィックスをつけていない変数が現在のシンボルテーブルに存在する場合にのみ変数を生成します。
  • EXTR_REFS
    • 変数を参照で展開します。

compact

compact関数は、任意の数の対象変数名から1つの配列を作成します。

array compact ( mixed $varname1 [, mixed $... ] )

1つにまとめる対象の変数名を列挙していきます。

$user = ['name' => 'username', 'age' => 20, 'email' => 'mail@example.com'];
$comment = "Hello world!";
$php = ["Laravel", "Symfony", "cakePHP", "ZendFramework"];

$data = compact('user', 'comment', 'php');

print_r($data);
// Array
//(
//    [user] => Array
//        (
//            [name] => username
//            [age] => 20
//            [email] => mail@example.com
//        )
//    [comment] => Hello world!
//    [php] => Array
//        (
//            [0] => Laravel
//            [1] => Symfony
//            [2] => cakePHP
//            [3] => ZendFramework
//        )
//)

array_walk

array_walk関数は、対象配列に対して一律で定義した関数を適用させます。

bool array_walk ( array &$array , callable $callback [, mixed $userdata = NULL ] )

第一引数に対象配列を、第二引数には適用させる関数名を渡します。

function callback01($value) {
echo sprintf("%d ", $value * 2);
}

$array = [1, 2, 3, 4, 5];

array_walk($array, 'callback01');
// => 2 4 6 8 10

また、オプションで第三引数に任意のパラメータを渡す事が出来ます。

function callback02($country, $key, $add) {
echo sprintf("[%s] %s:%s ", $key, $add, $country);
}

$array = ['ja' => '日本', 'uk' => 'イギリス', 'usa' => 'アメリカ'];

array_walk($array, 'callback02', '国名');
// =>  [ja] 国名:日本 [uk] 国名:イギリス [usa] 国名:アメリカ

コールバック関数では、第一引数に配列から取り出される1つの値、第二引数には配列のキー、第三引数に任意のパラメータが渡ります。

また、複数の値を渡したい場合は第三引数にも配列で渡すと好きなだけ任意のパラメータを渡せます。

function callback03($value, $key, $params) {
echo sprintf('%d ', $value + $params[0] + $params[1]);
}
$array = [1, 2, 3, 4, 5];

$params = [10, 20];

array_walk($array, 'callback03', $params);
// => 31 32 33 34 35

array_reduce

array_reduce関数は、対象配列に対して、指定した関数を適用させその結果を返します。

mixed array_reduce ( array $array , callable $callback [, mixed $initial = NULL ] )

第一引数に対象配列、第二引数に適用させる関数名を渡します。

function callback01($total, $value) {
    $total += $value;
    return $total;
}

$array = [1, 2, 3, 4, 5];

// 配列の数値を全て加算します
var_dump( array_reduce($array, 'callback01') );
// => 15

// -----------------------------------

function callback02($result, $value) {
    if (!empty($result)) {
        $result = sprintf('%s:%s', $result, $value);
    } else {
        $result = $value;
    }

    return $result;
}
$array = ['AAA', 'BBB', 'CCC'];

// 配列の文字列を全て結合します。
var_dump( array_reduce($array, 'callback02') );
// => 'AAA:BBB:CCC'

コールバック関数では、第一引数に結果用変数、第二引数に配列から取り出される1つの値が渡ります。

また、array_reduce() のオプションとして第三引数に初期値を渡す事が出来ます。

function callback03($total, $value) {
    $total += $value;
    return $total;
}

$array = [1, 2, 3, 4, 5];

// 初期値を10として、配列の数値を全て加算します
var_dump( array_reduce($array, 'callback03', 10) );
// => 25

第三引数を渡した場合には、コールバックの結果変数に初期値として入ります。

in_array

in_array関数は、対象配列に対して、指定の値が存在するかを返します。

bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] )

第一引数にチェックしたい値を、第二引数に対象配列を渡します。また、オプションで第三引数に型比較を行うかを渡せます。デフォルトは false で型比較は行いません。

$array = [1, 2, 3, 4, 5];

var_dump( in_array(3, $array));
// => true

var_dump( in_array('3', $array, true));
// => false

in_array関数では、検索用のインデックスを自動で作成するので、手動でループして検索を行うよりもこちらの方が高速です。

array_search関数は、対象配列に対して指定値で検索を行い、見つかった場合はその値のキーを返します。

mixed array_search ( mixed $needle , array $haystack [, bool $strict = FALSE ] )

第一引数に検索する値を、第二引数には対象配列を渡します。また、オプションとして第三引数に型比較を行うかを渡せます。デフォルトは false で型比較は行われません。

$array = [1, 2, 3, 4, 5];

var_dump( array_search(4, $array) );
// => 3

var_dump( array_search('4', $array, true) );
// => false

array_sum

array_sum関数は、対象配列中の数値を全て加算し合計を返します。

number array_sum ( array $array )

引数には合算する配列を渡します。配列内の値は、数字であれば数値型ではなく文字列型でも動作しますが、文字列の場合はスキップされます。

$array = [1, 2, 3, 4, 5];

var_dump( array_sum($array) );
// => 15

var_dump( array_sum([1, 2, 'c']) ); // 文字列はスキップします
// => 3

var_dump( array_sum([1, '2', 'c']) ); // 文字列型数値でも動作しますs
// => 3

var_dump( array_sum(['a', 'b', 'c']) ); // これは動作しません
// => 0

array_merge

array_merge関数は、対象の配列同士をマージします。

array array_merge ( array $array1 [, array $... ] )

引数には、マージしたい配列を渡します。2つ以上でも渡せます。

$array1 = [1, 2, 3];
$array2 = [4, 5, 6];
$array3 = [7, 8, 9];

print_r( array_merge($array1, $array2) );
// Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 [5] => 3 )

print_r( array_merge($array1, $array2, $array3) );
// Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 [5] => 6 [6] => 7 [7] => 8 [8] => 9 )

キーが数値インデックスの場合、同じキーがあったとしても早く渡した方のキーが優先され、後からマージされた配列のキーは新たに振り直されます。

文字列型のキーの場合で同じキーがある場合は、後からマージされたものが先にマージしたものを上書きします。

$array1 = ['a' => 'A', 'b' => 'B', 'c' => 'C', ];
$array2 = ['a' => 'D', 'b' => 'E', 'c' => 'F', ];

print_r( array_merge($array1, $array2) );
// Array ( [a] => D [b] => E [c] => F )

array_diff

array_diff関数は、対象配列に対して、指定配列に存在しない値の集合を返します。

array array_diff ( array $array1 , array $array2 [, array $... ] )

第一配列には差分を抽出する対象の配列を、第二引数以降には差分を抽出する為にぶつける配列を渡します。

$array1 = ['AAA', 'BBB', 'CCC'];
$array2 = ['AAA', 'bbb', 'ccc'];
// Array ( [1] => BBB [2] => CCC )

print_r( array_diff($array1, $array2) );

第一引数の配列に対して、第二引数以降の配列達に無い value 値のみが返されます。

尚、キーは振り直されません。

$array1 = [1, 2, 3, 4, 5];
$array2 = [9, 1, 4, 2, 7];

print_r( array_diff($array1, $array2) );
// Array ( [2] => 3 [4] => 5 )

差分が無い場合は、空の配列が返ります。

$array1 = ['AAA', 'BBB', 'CCC'];
$array2 = ['AAA', 'BBB', 'CCC'];

print_r( array_diff($array1, $array2) );
// Array ()

また、1つ注意点として、array_diff() は、数値型を文字列型へキャストしてから比較を行います。つまり以下のような場合は、差分は無いと判定されます。

$array1 = [1, 2, 3, 4, 5];
$array2 = ['1', '2', '3', '4', '5'];

print_r( array_diff($array1, $array2) );
// Array ()

比較処理は以下のフォーマットで行われます。

(string) $elem1 === (string) $elem2

array_filter

array_filter 関数は、対象配列に対してコールバック関数を適用し、内容をフィルタ処理します。

array array_filter ( array $array [, callable $callback [, int $flag = 0 ]] )

第一引数にフィルタリングを行う配列を、第二引数にコールバック関数名を渡します。オプションで第三引数に、コールバック関数へ送る配列の形式を設定できます。

function isAdult($value)
{
    return ($value >= 20);
}

$array = [18, 19, 20, 21, 22];

print_r( array_filter($array, 'isAdult') );
// Array ( [2] => 20 [3] => 21 [4] => 22 )

array_filter 関数の第二引数はオプション扱いになっており、第一引数のみでも動作します。その場合は、配列の値が false 判定となる値がフィルタリングされます。

$array = [0, 1, 2, 3, 4];

print_r( array_filter($array) );
// Array ( [1] => 1 [2] => 2 [3] => 3 [4] => 4 )

また、PHP5.6 から第三引数へ定数を渡す事でコールバック関数へ渡す対象配列の形を指定できます。以下があります。

  • ARRAY_FILTER_USE_KEY
    • コールバック関数へキーを渡す
  • ARRAY_FILTER_USE_BOTH
    • コールバック関数へキーと値を渡す

第三引数を指定しない場合は、値がコールバック関数へ渡されます。

function under3($key)
{
    return ($key < 3);
}

$array = [100, 200, 300, 400, 500];

// コールバック関数へはキーが渡されます
print_r( array_filter($array, 'under3',  ARRAY_FILTER_USE_KEY ) );
// Array ( [0] => 100 [1] => 200 [2] => 300 )


function sameKeyVal($value, $key)
{
    return ($key == $value);
}

$array = [0, 1, 2, 33, 44, 55];

// コールバック関数へはキーと値が渡されます
print_r( array_filter($array, 'sameKeyVal',  ARRAY_FILTER_USE_BOTH ) );
// Array ( [0] => 0 [1] => 1 [2] => 2 )

array_unique

array_unique関数は、対象配列の値から重複を除去します。

array array_unique ( array $array [, int $sort_flags = SORT_STRING ] )

第一引数に対象配列を渡します。オプションで比較処理方式を指定できます。

$array = [1, 3, 2, 1, 1, 4, 2];

print_r( array_unique($array) );
// Array ( [0] => 1 [1] => 3 [2] => 2 [5] => 4 )

第二引数オプションには、以下の定数が渡せます。

  • SORT_REGULAR
    • 型比較無し、通常の比較
  • SORT_NUMERIC
    • 数理として比較
  • SORT_STRING
    • 文字列として比較
  • SORT_LOCALE_STRING
    • 設定されている現在のロケールに沿い、文字列として比較
$array = ['40p', 40];
print_r( array_unique($array, SORT_REGULAR) );
// Array ( [0] => 40p )

print_r( array_unique($array, SORT_NUMERIC) );
// Array ( [0] => 40p )

print_r( array_unique($array, SORT_STRING) );
// Array ( [0] => 40p [1] => 40 )

print_r( array_unique($array, SORT_LOCALE_STRING) );
// Array ( [0] => 40p [1] => 40 )

また、array_unique() と array_merge() を用いる事で、和集合演算を行う事が出来ます。

// 和集合演算を行う
function getUnion($ary1, $ary2)
{
    return array_unique(array_merge($ary1, $ary2));
}

$array1 = [1, 3, 4, 5, 9, 13, 15, 17, 19];
$array2 = [2, 4, 6, 8, 9, 10, 13, 15, 16];

// 和集合を求める
$union = getUnion($array1, $array2);

// 並び替え
sort($union, SORT_NUMERIC );

var_dump($union);
//  0 => int 1
//  1 => int 2
//  2 => int 3
//  3 => int 4
//  4 => int 5
//  5 => int 6
//  6 => int 8
//  7 => int 9
//  8 => int 10
//  9 => int 13
//  10 => int 15
//  11 => int 16
//  12 => int 17
//  13 => int 19

array_intersect

array_intersect関数は、対象配列同士の共通項を取り出します。いわゆる、積集合演算を行う事が出来ます。

array array_intersect ( array $array1 , array $array2 [, array $... ] )

引数に配列を渡しますが、2つ以上でも渡せます。

$array1 = [1, 3, 4, 5, 9, 13, 15, 17, 19];
$array2 = [2, 4, 6, 8, 9, 10, 13, 15, 16];

var_dump( array_intersect($array1, $array2) );
//  2 => int 4
//  4 => int 9
//  5 => int 13
//  6 => int 15

array_push

array_push関数は、対象配列の末尾に要素を追加します。

int array_push ( array &$array [, mixed $... ] )

第一引数に追加対象配列を、第二引数以降に追加する要素を渡します。

$array = ["Laravel", "Symfony"];

array_push($array, "cakePHP", "ZendFramework");

var_dump($array);
//  0 => string 'Laravel'
//  1 => string 'Symfony'
//  2 => string 'cakePHP'
//  3 => string 'ZendFramework'

array_pop

array_pop関数は、対象配列の末尾の要素を除去します。

mixed array_pop ( array &$array )

引数には操作対象の配列のみを渡しますが、参照渡しになるので、結果配列を引数で受け取らなくてもグローバル側へ自動で適用されます。

$array = ["Laravel", "Symfony", "cakePHP", "ZendFramework"];

array_pop($array);

var_dump($array);
//  0 => string 'Laravel'
//  1 => string 'Symfony'
//  2 => string 'cakePHP'

array_shift

array_shift関数は、対象配列の先頭から要素を1つ取り出します。

mixed array_shift ( array &$array )

引数に操作対象配列を取ります。配列は参照渡しとなるためグローバル変数側も先頭の要素が除去された状態となります。返り値は、取り出された要素が返されます。

$array = ["Laravel", "Symfony", "cakePHP", "ZendFramework"];

$first = array_shift($array);

var_dump($first); // 取り出された先頭の要素
// => 'Laravel'

var_dump($array); // 先頭の要素が取り出された後の配列
//  0 => string 'Symfony'
//  1 => string 'cakePHP'
//  2 => string 'ZendFramework'

array_unshift

array_unshift関数は、対象配列の先頭に要素を追加します。

int array_unshift ( array &$array [, mixed $... ] )

第一引数に追加対象配列を、第二引数以降に追加する要素を列挙します。

$array = ["Laravel", "Symfony", "cakePHP", "ZendFramework"];

array_unshift($array, 'Phalcon', 'CodeIgniter');

var_dump($array);
//  0 => string 'Phalcon'
//  1 => string 'CodeIgniter'
//  2 => string 'Laravel'
//  3 => string 'Symfony'
//  4 => string 'cakePHP'
//  5 => string 'ZendFramework'

まとめ

配列処理を行う場合には、ループで回してそれぞれ処理していく事も出来ますが、それを関数に渡すだけで高速に処理してくれたり、手動では難しい厳密な比較を行ってくれたりと、PHP の配列操作関数には便利なものがたくさん揃っています。これらを知っているといないとでは、WEB アプリケーション構築のスピードや堅牢性もかなり変わってくるので、是非試してみてください。

Author

rito

  • Backend Engineer
  • Tokyo, Japan
  • PHP 5 技術者認定上級試験 認定者
  • 統計検定 3 級