配列 (array)

配列の関数
分類 関数 説明
生成 array 配列を生成する
range ある範囲の整数を有する配列を作成する
compact 変数名とその値から配列を作成する
要素数 count 変数に含まれるすべての要素、あるいはオブジェクトに含まれるプロパティの数を数える
sizeof countの別名
キー array_keys 配列のキーすべて、あるいはその一部を返す
array_change_key_case 配列のすべてのキーを小文字もしくは大文字に変更する
array_flip 配列のキーと値を反転する
array_values 配列のすべての値を返す
値の設定 array_fill 配列を指定した値で埋める
array_fill_keys 配列を指定した値で埋める (指定されたキーのみ)
array_pad 指定した要素数となるように、指定した値で配列を埋める
追加/削除 array_push 配列の末尾に1つ以上の要素を追加する
array_pop 配列の末尾から1つの要素を取り除く
array_shift 配列の先頭から1つの要素を取り出す
array_unshift 配列の先頭に1つ以上の要素を追加する
ソート sort 配列をソートする
rsort 配列を逆順にソートする
ksort 配列をキーでソートする
krsort 配列をキーで逆順にソートする
asort 配列をソートする (連想キーと要素との関係を維持)
arsort 配列を逆順にソートする (連想キーと要素との関係を維持)
natsort 自然順アルゴリズムで配列をソートする
natcasesort 大文字/小文字を区別しない自然順アルゴリズムで配列をソートする
usort ユーザー定義の比較関数で配列を値でソートする
uksort ユーザー定義の比較関数で配列をキーでソートする
uasort ユーザー定義の比較関数で配列をソートする (連想キーと要素との関係を維持)
array_reverse 要素を逆順にした配列を返す
array_multisort 複数の多次元の配列をソートする
shuffle 配列を要素をランダムに並べ替える (シャッフルする)
検索 array_search 指定した値を配列から検索し、見つかった場合に対応するキーを返す
in_array 配列に値があるかチェックする
array_key_exists 指定したキーまたは添字が配列にあるかどうかを調べる
array_count_values 配列の値の数を数える
置換 array_replace 渡された配列の要素を置き換える
array_replace_recursive 渡された配列の要素を再帰的に置き換える
array_splice 配列の一部を削除し、他の要素で置き換える
抽出 array_slice 配列の一部を展開する
array_filter コールバック関数を使用して、配列の要素をフィルタリングする
array_rand 配列から1つ以上の要素をランダムに取得する
差分 array_diff 配列の差を計算する
array_diff_key キーを基準にして配列の差を計算する
array_diff_assoc 追加された添字の確認を含めて配列の差を計算する
array_diff_ukey コールバック関数を用い、キーを基準にして配列の差を計算する
array_diff_uassoc コールバック関数を用い、追加された添字の確認を含めて配列の差を計算する
array_udiff データの比較にコールバック関数を用い、配列の差を計算する
array_udiff_assoc データの比較にコールバック関数を用い、追加された添字の確認を含めて配列の差を計算する
array_udiff_uassoc データと添字の比較にコールバック関数を用い、追加された添字の確認を含めて配列の差を計算する
マージ array_merge 1つまたは複数の配列をマージする
array_merge_recursive 2つ以上の配列を再帰的にマージする
array_combine 一方の配列をキーとし、もう一方の配列を値として、1つ配列を生成する
重複 array_unique 配列から重複した値を削除する
構造 array_chunk 配列を分割する
走査 current 配列内の現在の要素を返す
pos currentの別名
key 配列から現在のキーを返す
each 配列から現在のキーと値のペアを返して、内部ポインタ (カーソル) を進める
next 配列の内部ポインタを進める
prev 配列の内部ポインタを前に戻す
reset 配列の内部ポインタを先頭要素にセットする
end 配列の内部ポインタを最終要素にセットする
関数の適用 array_walk 配列のすべての要素にユーザー関数を適用する
array_walk_recursive 配列のすべての要素にユーザー関数を再帰的に適用する
array_map 指定した配列の要素にコールバック関数を適する
演算 array_sum 配列の値の和を計算する
array_product 配列の値の積を計算す
共通項 array_intersect 配列の共通項を計算する
array_intersect_key キーを基準にして配列の共通項を計算する
array_intersect_assoc 追加された添字の確認も含めて配列の共通項を確認する
array_intersect_ukey コールバック関数を用い、キーを基準にして配列の共通項を計算する
array_intersect_uassoc コールバック関数を用い、追加された添字の確認も含めて配列の共通項を確認する
array_uintersect データの比較にコールバック関数を用い、配列の共通項を計算する
array_uintersect_assoc データの比較にコールバック関数を用い、追加された添字の確認も含めて配列の共通項を計算する
array_uintersect_uassoc データと添字の比較にコールバック関数を用い、追加された添字の確認も含めて配列の共通項を計算する
結合 array_reduce コールバック関数を用いて配列を普通の値に変更することにより、配列を再帰的に減らす
シンボルテーブル extract 配列からシンボルテーブルに変数をインポートする (compactの逆)
変数への代入 list 配列と同様の形式で、複数の変数への代入を行う
PHP: 配列 関数 - Manual

配列の作成

配列は、array()関数により生成できます。

$a = array();
PHP: array - Manual

PHP 5.4以降では、次のような短縮構文も使用できます。

$a = [];

要素の追加

角かっこ構文を使用します。

$a[] = value;

添字を指定するとき、それが存在しないならば新しい要素として追加されます。

$a[ key ] = value;

添字 (key) には整数、文字列または変数を使用できます。

$a = array();
$a[     ] = 1;
$a[ 'a' ] = 2;

$a[ 5 ] = 3;
$a[   ] = 4;
$a[ 4 ] = 5;
$a[   ] = 6;

print_r( $a );
// Array
// (
//     [0] => 1
//     [a] => 2
//     [5] => 3
//     [6] => 4
//     [4] => 5
//     [7] => 6
// )

要素を末尾に追加

array_push()関数を使用して追加する方法もありますが、この関数は複数の要素を追加するためのものです。ひとつの要素を追加するだけならば、添字を指定せずに$array[]= と記述します。このように追加された要素には、最大値となる添字が設定されます。

array_push()
int array_push (
    array &$array ,
    mixed $var1
    [, mixed $var2... ]
    )
PHP: array_push - Manual

配列$arrayに変数$var1$var2…を追加し、追加後の配列の長さを返します。

初期値の設定

$a = array( 1, 2, 3 );
// Array ( [0] => 1 [1] => 2 [2] => 3 )
PHP: array - Manual

末尾にカンマを置く構文も有効であり、

$a = array( 1, 2, 3, );

としても、カンマのない場合と同じ結果となります。

添字の指定

$a = array( 1, 2, 10=>3, 4 );
// Array ( [0] => 1 [1] => 2 [10] => 3 [11] => 4 )

添字を整数で指定すると、後に続く要素にはその数値に続く番号が割り当てられます。

すでに使用されている添字を指定すると、

$a = array( 1, 0=>2 );
// Array ( [0] => 2 )

のようになり、先のものが上書きされます。

添字に文字列を指定 (連想配列 : associative array)

$a = array( 'one'=>1, 'two'=>2, 'three'=>3 );
// Array ( [one] => 1 [two] => 2 [three] => 3 )

文字列と数値の混在

$a = array( 'one', '02'=>2, 03=>'three' );
// Array ( [0] => one [02] => 2 [3] => three )

数値として意味が同じ添字を、整数と文字列で指定すると、

$a = array( 0=>'A', '0'=>'B', '00'=>'C' );
// Array ( [0] => B [00] => C )

のようになり、先のものが上書きされます。

文字列から作成

Stringのexplode()関数は、文字列を分割して配列を作成します。

変数から作成

array compact ( mixed $varname [, mixed $... ] )
PHP: compact - Manual

変数名をキーとして、その値とともに配列を作成します。

$a = 1;
$b = 2;
$c = 3;

$array = compact( 'a', 'b', 'c' );
// Array
// (
//     [a] => 1
//     [b] => 2
//     [c] => 3
// )

引数の$varnameには、変数の名前を文字列で指定します。変数を渡すのではありません。

引数は配列でも渡せます。

$array = compact( array( 'a', 'b', 'c' ) );

要素の数

int count (
    mixed $array_or_countable
    [, int $mode = COUNT_NORMAL ]
    )
PHP: count - Manual

要素へのアクセス

$a = array( 'a', 10=>'b', 'foo'=>'c' );

echo $a[ 0 ];     // 'a'
echo $a[ 10 ];    // 'b'
echo $a[ 'foo' ]; // 'c'

添字は、波かっこで囲っても同じです。

echo $a{ 0 };     // 'a'
echo $a{ 10 };    // 'b'
echo $a{ 'foo' }; // 'c'

存在しない要素から読み込むと、設定によっては注意されます。

echo $a[ 5 ]; // Notice: Undefined offset: 5

存在するかどうかは、array_key_exists()で確認できます。

変数による添字の指定

$x = 1;
$a[ $x ] = 10;  // $a[ 1 ] = 10; に等しい
なぜ、$foo[bar] は使用できないのか?

添字を配列で指定するならば、

$p = array( 1, 2, 3 );
$a[ $p[ 1 ] ] = 10;  // $a[ 2 ] = 10; に等しい

とします。

関数などの戻り値へのアクセス

関数やメソッドが配列を返す場合、PHP 5.4以降ではそれに添字を指定してアクセスできます。

$x = Foo()[ 0 ];

それ以前の環境では、次のように変数に代入してからアクセスする必要があります。

$p = Foo();
$x = $p[ 0 ];

要素の削除

変数の破棄と同様に、unset()で要素を削除できます。PHP: unset - Manual

$a = array( 1, 2, 3 );
unset( $a[ 1 ] );

print_r( $a );
// Array
// (
//     [0] => 1
//     [2] => 3
// )

ただしこの例のように、削除した要素以降の添字は変更されないことに注意が必要です。もし添字が連番になるように処理したいならば、array_splice()を使用します。

$a = array( 1, 2, 3 );
array_splice( $a, 1, 1 );

print_r( $a );
// Array
// (
//    [0] => 1
//    [1] => 3
// )

ループ内での要素の削除

foreach内で要素を削除するには、その要素のキーを使用します。

$a = array( 1, 2, 3 );
print_r( $a );

foreach( $a as $key=>$val )
{
    if( $val == 2 )
    {
        unset( $a[ $key ] );
    }
}
print_r( $a );
php - Unsetting array values in a foreach loop - Stack Overflow

重複する要素の削除

array array_unique (
    array $array
    [, int $sort_flags = SORT_STRING ]
    )
PHP: array_unique - Manual

配列$arrayから重複を取り除いて、新しい配列を返します。要素が重複した場合には、最初の要素のキーが新しい配列でのキーとなります。

$a = array( 'a'=>5, 'b'=>4, 'c'=>4, 'd'=>1 );
print_r( array_unique( $a ) );

// Array
// (
//     [a] => 5
//     [b] => 4
//     [d] => 1
// )

$sort_flagsで、重複の判定のための比較方法を指定できます。

  • SORT_REGULAR … 型変換をせずに比較
  • SORT_NUMERIC … 数値に型変換して比較
  • SORT_STRING … 文字列に型変換して比較 (既定値)
  • SORT_LOCALE_STRING … ロケールに基づき、文字列に型変換して比較
$a = array( 1, 1.0, '1.0', TRUE, 'A', 'a' );

print_r( array_unique( $a ) );
print_r( array_unique( $a, SORT_NUMERIC ) );
print_r( array_unique( $a, SORT_REGULAR ) );

// Array
// (
//     [0] => 1
//     [2] => 1.0
//     [4] => A
//     [5] => a
// )
// Array
// (
//     [0] => 1
//     [4] => A
// )
// Array
// (
//     [0] => 1
//     [1] => 1
//     [4] => A
//     [5] => a
// )

すべての要素をまとめて処理 (foreach)

配列の要素全体をまとめて処理するにはforeach構文を使用します。

foreach( $array as $value )
PHP: foreach - Manual

配列$arrayの要素が反復処理され、要素の値が変数$valueにコピーされます。

要素のキーも取得

foreach( $array as $key=>$value )

こちらの構文では要素のキーが変数$keyに、値が$valueにコピーされます。

$array = array(
    'item1'=>'a',
    'item2'=>'b',
    'item3'=>'c',
    );

foreach( $array as $key=>$value )
{
    echo "$key - $value \r\n";
}

// 出力
// item1 - a
// item2 - b
// item3 - c

要素自身を変更

foreach( $array as &$value )

通常は変数$valueへは、要素のコピーが渡されます。もし配列の要素へ作用を及ぼしたいのならば、変数名の前に&をつける参照渡し参照を取得するようにします。

$a = array( 1, 2, 3 );

foreach( $a as &$val )
{
    $val *= 2;
}
unset( $val );

print_r( $a );
// Array
// (
//     [0] => 2
//     [1] => 4
//     [2] => 6
// )

ループを抜けた後も変数$valueは最後の要素への参照を保持しているため、安全のためunset()でそれを解除するようにします。

多次元配列 (Multidimensional Arrays)

$a = array(
    array( 1, 2, 3 ),
    array( 4, 5, 6 )
    );

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

多次元配列には次のようにアクセスします。他方それが未定義の配列要素ならば、 それが多次元配列として作成されます。

$a[ 0 ][ 0 ] = 1;
$a[ 0 ][ 1 ] = 2;
$a[ 0 ][ 2 ] = 3;

$a[ 1 ][ 0 ] = 4;
$a[ 1 ][ 1 ] = 5;
$a[ 1 ][ 2 ] = 6;

要素の検索 (search)

その配列が連想配列で、指定のキーに一致する要素を得たいだけならば、そのキーを添字に指定してアクセスします。ただしそのキーが配列に存在しない可能性があるならば、先にarray_key_exists()で確認すべきです。

$a = array( 'a'=>1, 'b'=>2, 'c'=>3 );

echo $a[ 'b' ]; // 2
echo $a[ 'd' ]; // Notice: Undefined index

array_search()

指定した値に一致する要素を検索します。

mixed array_search (
    mixed $needle , // 検索する要素の
    array $haystack // 検索対象の配列
    [, bool $strict = false ] // TRUEの場合、型の一致またはオブジェクトの同一性も考慮します
    )
PHP: array_search - Manual

配列$haystackの値から$needleを検索し、一致する要素のキーを返します。一致する要素が多数ある場合には、最初にマッチしたキーが返されます。一致する要素がない場合にはFALSEが返されます。

$strictにTRUEが指定された場合には、オブジェクトの同一性も考慮します。

$a = array( 1, 2, 3 );
$b = array( 'a'=>1, 'b'=>2, 'c'=>3 );
$c = array( 'a'=>'A', 'b'=>'B', 'c'=>'C' );

echo array_search( 2, $a );   // 1
echo array_search( 2, $b );   // 'b'
echo array_search( 'B', $c ); // 'b'

echo array_search( '2', $a );       // 1
echo array_search( '2', $a, TRUE ); // FALSE

in_array()

bool in_array (
    mixed $needle , // 検索する要素の
    array $haystack // 検索対象の配列
    [, bool $strict = FALSE ]
    )
PHP: in_array - Manual

基本的にarray_search()と同じです。違いは一致した場合の戻り値で、要素のキーではなくTRUEが返されます。

array_key_exists()

bool array_key_exists (
    mixed $key ,  // 検索する要素のキー
    array $search // 検索対象の配列
    )
PHP: array_key_exists - Manual

in_array()に似ていますが、検索対象が要素の値ではなくキーです。

array_count_values()

array array_count_values ( array $input )
PHP: array_count_values - Manual

要素の置換 (replace)

array_splice()

array array_splice(
    array &$input ,
    int $offset
    [, int $length
    [, mixed $replacement = array()
    ]] )
PHP: array_splice - Manual

$offsetから$length個の要素を削除し、$replacementで置換します。$replacementを省略すると、削除のみが行われます。

戻り値で、削除された要素の配列が返されます。

要素の並べ替え (sort)

すべての配列関数は、配列自身を変更します。

ソート関数
ソートの基準 ソート順 キーと値の関係
維持しない 維持する
昇順 ▲ sort() asort()
降順 ▼ rsort() arsort()
ユーザー定義 usort() uasort()
ランダム shuffle() ---
自然順 --- natsort()
自然順
(大文字/小文字を区別しない)
--- natcasesort()
キー 昇順 ▲ --- ksort()
降順 ▼ --- krsort()
ユーザー定義 ---- uksort()
PHP: 配列のソート - Manual
bool sort (
    array &$array
    [, int $sort_flags = SORT_REGULAR ]
    )
PHP: sort - Manual

引数の$array自身をソートします。

ソート順を独自に定義

bool usort (
    array &$array ,        // 配列
    callable $cmp_function // 比較関数
    )
PHP: usort - Manual
function cmp( $a, $b )
{
    if( $a == $b )
    {
        return 0;
    }
    return ( $a < $b )? -1 : 1;
}

$x = array( 3, 2, 5, 6, 3 );

usort( $x, 'cmp' );
print_r( $x );

// Array
// (
//     [0] => 2
//     [1] => 3
//     [2] => 3
//     [3] => 5
//     [4] => 6
// )

無名関数を使用すれば、この処理は

usort( $x, function( $a, $b )
{
    if( $a == $b )
    {
        return 0;
    }
    return ( $a < $b )? -1 : 1;
} );

のように記述できます。

また次のような連想配列を要素に持つ多次元配列を、その文字列の要素の順でソートする場合には、次のようにします。

$x = array(
    array( 'foo'=>'ab', 'bar'=>1 ),
    array( 'foo'=>'aa', 'bar'=>2 ),
    array( 'foo'=>'ac', 'bar'=>3 )
);

usort( $x, function( $a, $b )
{
    return strcmp( $a[ 'foo' ], $b[ 'foo' ] );
} );

print_r( $x );

// Array
// (
//     [0] => Array( [foo] => aa [bar] => 2 )
//     [1] => Array( [foo] => ab [bar] => 1 )
//     [2] => Array( [foo] => ac [bar] => 3 )
// )

配列の結合 (merge)

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

配列結合演算子 (+) でも配列をマージできますが、数値添字要素の扱いと、要素のキーが重複したときの挙動がarray_merge()とは異なります。PHP: 配列演算子 - Manual

array_merge()と配列結合演算子の比較
添字の種類 array_merge() 配列結合演算子
添字の扱い 重複の発生時 添字の扱い 重複の発生時
数値 数値は無視され、ゼロからの連番に置換される。 数値が無視されるため、発生しない。 保存される。 の要素が失われる。
文字列 保存される。 の要素が失われる。
$r1 = array( 1, 'a'=>2, 'b'=>3 );
$r2 = array( 4, 'a'=>5, 'c'=>6 );

print_r( array_merge( $r1, $r2 ) );
// Array
// (
//     [0] => 1
//     [a] => 5
//     [b] => 3
//     [1] => 4
//     [c] => 6
// )

print_r( $r1 + $r2 );
// Array
// (
//     [0] => 1
//     [a] => 2
//     [b] => 3
//     [c] => 6
// )

文字列への変換

文字列の関数implode()で、配列を1つの文字列に連結できます。