| 分類 | 関数 | 説明 |
|---|---|---|
| 生成 | 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 | 配列と同様の形式で、複数の変数への代入を行う |
配列は、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[]= と記述します。このように追加された要素には、最大値となる添字が設定されます。
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 )
のようになり、先のものが上書きされます。
$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
角括弧に添字を指定してアクセスできます。角括弧構文による配列要素へのアクセス - PHP: 配列 - Manual
$a = array( 'a', 10=>'b', 'foo'=>'c' ); echo $a[ 0 ]; // 'a' echo $a[ 10 ]; // 'b' echo $a[ 'foo' ]; // 'c'
添字は、波かっこで囲っても同じです。 波かっこでアクセスする構文は、PHP 8.0.0で廃止されています。角括弧構文による配列要素へのアクセス - PHP: 配列 - Manual
echo $a{ 0 }; // 'a'
echo $a{ 10 }; // 'b'
echo $a{ 'foo' }; // 'c'
存在しない要素から読み込むとE_WARNING (PHP 8.0より前はE_NOTICE) が発生し、未定義の変数と同様にNULLが返されます。
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; に等しい
とします。
現在の要素の値はcurrent()で、キーはkey()で取得できます。そして現在の要素を示すポインタはnext()で進められ、prev()で戻せます。
$a = array('a', 'b');
$r1 = current($a); // "a"
$k1 = key($a); // 0
$r2 = next($a); // "b"
$k2 = key($a); // 1
$r3 = next($a); // false
$r3= current($a); // false
$k3 = key($a); // null
関数やメソッドが配列を返す場合、PHP 5.4以降ではそれに添字を指定してアクセスできます。
$x = Func()[ 0 ];
それ以前の環境では、次のように変数に代入してからアクセスする必要があります。
$p = Func(); $x = $p[ 0 ];
変数の破棄と同様に、unset()で要素を削除できます。PHP: unset - Manual
$a = array(0, 1, 2); unset($a[1]); print_r($a); // Array // ( // [0] => 0 // [2] => 2 // ) unset($a[1]); // 削除した要素を再び削除しようとしても、何も起きない unset($a[3]); // 存在しない要素を削除しようとしても、何も起きない
ただしこの例のように、削除した要素以降の添字は変更されないことに注意が必要です。もし添字が連番になるように処理したいならば、array_splice()を使用します。
$a = array(1, 2, 3); array_splice($a, 1, 1); print_r($a); // Array // ( // [0] => 1 // [1] => 3 // )
連想配列の要素も同様に削除できます
$a = array('one' => 1, 'two' => 2, 'three' => 3);
unset($a['one']);
// Array
// (
// [two] => 2
// [three] => 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で、重複の判定のための比較方法を指定できます。
$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( $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()でそれを解除するようにします。
$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;
その配列が連想配列で、指定のキーに一致する要素を得たいだけならば、そのキーを添字に指定してアクセスします。ただしそのキーが配列に存在しない可能性があるならば、先にarray_key_exists()で確認すべきです。
$a = array( 'a'=>1, 'b'=>2, 'c'=>3 ); echo $a[ 'b' ]; // 2 echo $a[ 'd' ]; // Notice: Undefined index
指定した値に一致する要素を検索します。
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
bool in_array (
mixed $needle , // 検索する要素の値
array $haystack // 検索対象の配列
[, bool $strict = FALSE ]
)
PHP: in_array - Manual
基本的にarray_search()と同じです。違いは一致した場合の戻り値で、要素のキーではなくTRUEが返されます。
bool array_key_exists (
mixed $key , // 検索する要素のキー
array $search // 検索対象の配列
)
PHP: array_key_exists - Manual
in_array()に似ていますが、検索対象が要素の値ではなくキーです。
この関数をオブジェクトに対して用いることはPHP 7.4.0以降で非推奨となっています。そのような用途にはproperty_exists()を用います。注意 - PHP: array_key_exists - Manual
array array_count_values ( array $input )PHP: array_count_values - Manual
指定の配列の、対応するキーの要素を置換できます。
$a = array(0, 1, 2, 3, 4);
$b = array(1 => 10, 20);
$c = array(4 => 40);
$d = array_replace($a, $b, $c);
// Array ( [0] => 0 [1] => 10 [2] => 20 [3] => 3 [4] => 40 )
array array_splice(
array &$input ,
int $offset
[, int $length
[, mixed $replacement = array()
]] )
PHP: array_splice - Manual
$offsetから$length個の要素を削除し、$replacementで置換します。$replacementを省略すると、削除のみが行われます。
戻り値で、削除された要素の配列が返されます。
すべての配列関数は、配列自身を変更します。
| ソートの基準 | ソート順 | キーと値の関係 | |
|---|---|---|---|
| 維持しない | 維持する | ||
| 値 | 昇順 ▲ | sort() | asort() |
| 降順 ▼ | rsort() | arsort() | |
| ユーザー定義 | usort() | uasort() | |
| ランダム | shuffle() | --- | |
| 自然順 | --- | natsort() | |
| 自然順 (大文字/小文字を区別しない) |
--- | natcasesort() | |
| キー | 昇順 ▲ | --- | ksort() |
| 降順 ▼ | --- | krsort() | |
| ユーザー定義 | ---- | uksort() | |
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 )
// )
array array_merge( array $array1 [, array $... ] )array array_merge ( array $array1 [, array $... ] )
配列結合演算子 (+) でも配列をマージできますが、数値添字要素の扱いと、要素のキーが重複したときの挙動がarray_merge()とは異なります。PHP: 配列演算子 - Manual
| 添字の種類 | 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つの文字列に連結できます。