配列関数

配列のキー名にはスペースがあっても許容される。

$arr = array(
	'the name' => 'myname',
);

配列の作成(初期化)

//最後の要素のあとのカンマは、書いても書かなくてもかまいません。
//1行で定義する場合は省略する、複数行の場合は最後のカンマを付けるのが一般的

$arr = array();
$arr = array(1, 2, 3,);
$arr = array("foo" => "bar", "bar" => "foo",);

// 配列の短縮構文
$arr = [];
$arr = [1, 2, 3,];
$arr = ["foo" => "bar", "bar" => "foo",];

array_push(array &$array, mixed …$values): int

一つ以上の要素を配列の最後に追加する。

戻り値
処理後の配列の中の要素の数を返します。

array_pop(array &$array): mixed

配列の末尾から要素を取り除く。

戻り値
配列 array の最後の要素の値を取り出して返します。 array が空の場合、 null が返されます。

array_unshift(array &$array, mixed …$values): int

一つ以上の要素を配列の最初に加える

戻り値
処理後の array の要素の数を返します。

array_shift(array &$array): mixed

配列の先頭から要素を一つ取り出す、削除する

戻り値
取り出した値を返します。array が空の場合や配列でない場合は null を返します。

array_flip(array $array): array

配列のキーと値を反転する。

array の値は有効なキーを必要とすることに注意してください。 すなわち、キーは、int または string である必要があります。ある値が間違った型である場合、 警告が出力され、問題のこのキー/値の組は結果には含まれません。
ある値が複数回出現した場合、最後のキーがその値として使用され、 その他の値は失われます。

array_pad(array $array, int $length, mixed $value): array

指定長、指定した値で配列を埋める。
引数で指定した配列は変更されない 配列のコピーを返す。
$length に負数を指定すると左側を埋める。

array_reverse(array $array, bool $preserve_keys = false): array

配列を受け取って、要素の順番を逆にした新しい配列を返します。

preserve_keys
true の場合は数値のキーを保持します。 非数値のキーは、この設定にかかわらず常に保持されます。

array_splice()

array_splice(
    array &$array,
    int $offset,
    ?int $length = null,
    mixed $replacement = []
): array

配列の任意の場所に要素を追加したり、既存の要素を置換/削除する。
元の配列を変更する。戻り値は変更を加えた要素を返す。
replacement も指定した場合に offset から配列の最後まで全てを削除するには、 length を求めるために count($input) を使用してください。
offsetだけを指定(length、replacementは省略)した場合は、offset以降全て削除される。
配列の数値添字は保存されないことに注意しましょう。
数値以外のキーをreplacementで指定しても数値キーに変更される。

戻り値
変更された要素の配列。

$data = ['加藤', '山田', '太田', '永井', '田中', '杉浦'];
print_r(array_splice($data, 2, 3, ['マイク', 'ジョージ', 'トミー']));
Array
(
    [0] => 太田
    [1] => 永井
    [2] => 田中
)

print_r($data);
Array
(
    [0] => 加藤
    [1] => 山田
    [2] => マイク
    [3] => ジョージ
    [4] => トミー
    [5] => 杉浦
)

print_r(array_splice($data, -3, -2, ['長田', '杉山']));
Array
(
    [0] => ジョージ
)

print_r($data);
Array
(
    [0] => 加藤
    [1] => 山田
    [2] => マイク
    [3] => 長田
    [4] => 杉山
    [5] => トミー
    [6] => 杉浦
)

print_r(array_splice($data, 3));
Array
(
    [0] => 長田
    [1] => 杉山
    [2] => トミー
    [3] => 杉浦
)

print_r($data);
Array
(
    [0] => 加藤
    [1] => 山田
    [2] => マイク
)

print_r(array_splice($data, 1, 0, ['春日', '若林']));
Array
(
)

print_r($data);
Array
(
    [0] => 加藤
    [1] => 春日
    [2] => 若林
    [3] => 山田
    [4] => マイク
)

array_slice()

array_slice(
    array $array,
    int $offset,
    ?int $length = null,
    bool $preserve_keys = false
): array

特定範囲の要素だけを取り出す。元の配列は変更されない
デフォルトで配列の数値キーを並べなおし、リセットします。 preserve_keys を true にする事で数値キーを変更しないようにできる。 文字列のキーは、このパラメータの値にかかわらず常に保存されます。

戻り値
切り取った部分を返します。オフセットが配列のサイズより大きい場合は、空の配列を返します。

array_chunk(array $array, int $length, bool $preserve_keys = false): array

配列を、要素数が length の配列に分割します。 最後の部分の要素数は length より小さくなることもあります。元の配列は変更されない

$preserve_keys
true の場合はキーをそのまま保持します。 デフォルトは false で、各部分のキーをあらためて数字で振りなおします。

$input_array = array('a', 'b', 'c', 'd', 'e');
print_r(array_chunk($input_array, 2));
print_r(array_chunk($input_array, 2, true));

/*
Array
(
    [0] => Array
        (
            [0] => a
            [1] => b
        )

    [1] => Array
        (
            [0] => c
            [1] => d
        )

    [2] => Array
        (
            [0] => e
        )

)
Array
(
    [0] => Array
        (
            [0] => a
            [1] => b
        )

    [1] => Array
        (
            [2] => c
            [3] => d
        )

    [2] => Array
        (
            [4] => e
        )

)
*/

array_sum(array $array): int|float

配列の中の値の合計を整数または float として返します。
多次元配列の2階層以降は無視される。

array_values(array $array): array

配列から全ての値を取り出し、数値添字をつけた配列を返します。

$array = array("size" => "XL", "color" => "gold");
print_r(array_values($array));
Array
(
    [0] => XL
    [1] => gold
)

array_keys()

array_keys(array $array): array
array_keys(array $array, mixed $search_value, bool $strict = false): array

配列のキーすべて、あるいはその一部を返す。
search_value が指定された場合、 指定した値に関するキーのみが返されます。複数あれば全て返す。指定されない場合は、 array から全てのキーが返されます。
strict 検索時に厳密な比較 (===) を行うかどうかの指定。

array_key_exists(string|int $key, array $array): bool

array_key_exists() は、最初のレベルのキーだけを捜します。 多次元配列のネストされたキーは、この関数では見つけられません。
isset() は null 値を持つ配列キーに対して true を返しません。一方、array_key_exists() は true を返します。

//$person['name']の値が0、NULL、空の場合falseとなる
if( $person['name'] ) { ... }

//isset()は値がNULLの場合falseとなる
if( isset($person['name']) ) { ... }

extract(array &$array, int $flags = EXTR_OVERWRITE, string $prefix = “”): int

キーを変数名とする変数に展開する。
デフォルトでは同じ名前の変数が既に存在する場合上書きされる。$flagsによって動作を変更できる。
ユーザーの入力、例えば $_GET や $_FILES のような、 信頼できないデータに extract() を使用しないでください。

compact(array|string $var_name, array|string …$var_names): array

変数名とその値から配列を作成します。
extract() の逆の動作。
変数名を値とする文字列か、 変数名の配列のどちらかをパラメーターにする。変数名は $の付かない文字列です。

$city  = "Barcelona";
$state = "SPAIN";
$event = "APPLE";

$location_vars = array("city", "state");

$result = compact("event", $location_vars);
//$result = compact("event", "city", "state");でも同じ
print_r($result);

/*
Array
(
    [event] => APPLE
    [city] => Barcelona
    [state] => SPAIN
)
*/

array_walk(array|object &$array, callable $callback, mixed $arg = null): bool

ユーザー定義関数(コールバック)に要素の値、要素のキーが渡される。
$callback = function( $value, $key ){ .. } 引数の順番に注意
戻り値trueを返す。配列の値そのものを変更したい場合、一番目の引数をリファレンス渡しにする。(2番目の引数(key)をリファレンス渡しにするとE_WARNING が発生する(8.0.0) )

function tax_included( &$value, $key ) {
	$value = floor($value * (1 + 10 / 100));
}

$arr = array(1000, 2000, 3000, 10000);

array_walk( $arr, 'tax_included' );
var_dump($arr);

/*
array(4) {
  [0]=>
  float(1100)
  [1]=>
  float(2200)
  [2]=>
  float(3300)
  [3]=>
  float(11000)
}
*/

変更される可能性があるのは配列の値だけであり、 その構造を変更することはできません。つまり、 プログラマは要素の追加や削除そして並べ替えなどができないということです。 コールバック関数がこの条件を満たさない場合は、 この関数の動作は未定義で予期せぬ結果を得ることになります。

$argでコールバックに任意の引数を渡すことができる。

$data = ['田中' => '男', '新井' => '女', '吉田' => '男', '清水'=>'女', '村上' => '男'];

//無名関数のコールバックに引数を渡す例 $suffixに<br>が代入される
array_walk($data,
  function($value, $key, $suffix) {
    print "{$key}:{$value}{$suffix}";
  }, '<br>'
);

//コールバックを外に用意する場合
array_walk($data, 'callback', '<br>');

function callback($value, $key, $suffix) {
    print "{$key}:{$value}{$suffix}";
}

array_walk_recursive(array|object &$array, callable $callback, mixed $arg = null): bool

配列の全ての要素に、ユーザー関数を再帰的に適用する。入れ子の配列の場合に使用。

array_map(?callable $callback, array $array, array …$arrays): array

ユーザー定義関数(コールバック)で処理する。

複数の配列を引数とすることができる(array_walkとの違い)
複数の配列の要素数は同じである必要はない。要素が不足した側はnull値として扱われる
コールバックで値を受け取る。コールバックが受け取る引数は配列の数と一致していなければならない。数が多かった場合、溢れた分は無視されます。

戻り値:コールバックで処理を適用後の配列

$a = array('aaa','bbb','ccc');
$b = array('xxx','yyy','zzz');


function myCallback($n, $m) {
    echo $n, PHP_EOL;
    echo $m, PHP_EOL;
}

array_map('myCallback', $a, $b);
/* 出力
aaa
xxx
bbb
yyy
ccc
zzz
*/

コールバックにnullを指定することもできる。その場合個々の要素を配列に束ねた入れ子の配列を返す。

//コールバックにnullを指定した例
$data = ['ぱんだ', 'うさぎ', 'こあら'];
$data2 = ['panda', 'rabbit', 'koala'];

print_r(array_map(null, $data, $data2));

//結果:
Array
(
    [0] => Array
        (
            [0] => ぱんだ
            [1] => panda
        )

    [1] => Array
        (
            [0] => うさぎ
            [1] => rabbit
        )

    [2] => Array
        (
            [0] => こあら
            [1] => koala
        )
)

array_reduce(array $array, callable $callback, mixed $initial = null): mixed

単一の値を返す。
ユーザー定義関数(コールバック)にこれまでの総計(前回の反復処理の結果)、現在の処理している値が渡される。
$callback = function(carry, item){…}

function sum($carry, $item)
{
    $carry += $item;
    return $carry;
}
$a = array(1, 2, 3, 4, 5);
var_dump(array_reduce($a, "sum")); // int(15)

in_array(to_find, array, [, strict])

配列に値があるか、結果は true、false を返す。
array_searchと似ているが返り値が違う

array_search(mixed $needle, array $haystack, bool $strict = false): int|string|false

配列に値があるか、見つかったらkeyを返す 見つからなかったらfalse
最初にマッチしたキーだけを返す。マッチする全てのキーを返すには、array_keys()にパラメータsearch_valueを付けて使用する。
大文字小文字を区別する
strict に true を指定すると 「===」で比較する。

array_filter(array $array, ?callable $callback = null, int $mode = 0): array

コールバック関数を使用して要素(値)をフィルタリングする。
キーは不変
コールバックで外部の変数を使う場合は、use で指定する。
コールバック関数が与えられなかった場合、 array のエントリの中で空のものはすべて削除されます。 この場合の「空」の定義については、empty() 関数を参照して下さい。

戻り値:フィルタリングされた結果の配列を返します。元の配列を書き換えない。

mode
ARRAY_FILTER_USE_KEY値ではなく、キーだけを callback の引数として渡す
ARRAY_FILTER_USE_BOTH値だけではなく、値とキーの両方を callback の引数として渡す
省略された場合(既定)値のみを引数として渡す
array_filter($array1, "コールバック関数");

//コールバックでtrueが返された値が残る
$callback = function($elm){
    return $elm % 2;
};

$arr = [9,23,24,27];
$odds = array_filter($arr, $callback);
var_dump($odds);
/*
array(3) {
  [0]=>
  int(9)
  [1]=>
  int(23)
  [3]=>
  int(27)
}
*/

//コールバックが無名関数でない場合 関数名をnリテラルで指定
function callback($elem){
	return $elm % 2;
}
$odds = array_filter($arr, 'callback');

array_diff(array $array, array …$arrays): array

array を他の配列と比較し、 array の要素の中で他の配列には存在しないものだけを返します。

array_unique( array, $flags = SORT_STRING )

配列から重複した値を削除する。
キーは不変(はじめの要素のキーと値が保持されます)

$flags
SORT_REGULAR通常の比較 (型変換をしない) を行います
SORT_NUMERIC数値として比較します
SORT_STRING文字列として比較します
SORT_LOCALE_STRING現在のロケールにもとづいて文字列として比較します

array_intersect(array $array, array …$arrays): array

複数の配列に共通して含まれる値を集める。
キー不変

array_merge(array …$arrays): array

前の配列の後ろに配列を追加することにより、 ひとつまたは複数の配列の要素をマージし、得られた配列を返します。
連想配列のキーが重複している場合、前の値を後者で上書きされる
数値キーの場合は新たな番号を振られ追記される。

加算演算子(+)で配列の結合を行う場合との違いに注意。一般的に配列を結合する場合、array_mergeを使用するべき。

加算演算子の場合
$result = $array1 + $array2;
同一のキーがあった場合後者が無視される。数値キーの場合も同様。

$ary1 = [1,3,5];
$ary2 = [2,3,6];
$result = $ary1 + $ary2; //インデックス(キー)が同じなので$ary2は無視される
print_r($result);

//結果:
Array
(
    [0] => 1
    [1] => 3
    [2] => 5
)

//array_mergeの場合
$result = array_merge($ary1, $ary2);
print_r($result);

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

array_merge_recursive(array …$arrays): array

一つ以上の配列を再帰的にマージする。
array_mergeが同一のキーを上書きするのに対し、重複した場合入れ子の配列を生成する。

array_multisort

array_multisort(
    array &$array1,
    mixed $array1_sort_order = SORT_ASC,
    mixed $array1_sort_flags = SORT_REGULAR,
    mixed ...$rest
): bool

複数の配列を一度に、または、多次元の配列をその次元の一つでソートする際に使用可能です。
それぞれの配列の縦の並びを保ったまま並べ替えます。
連想配列のキー (string) は不変ですが、 数値添字は再度振り直されます。
比較結果が等しくなる二つの要素があった場合、それらの並び順は保持されます。(php8.0.0以降)
配列の長さは一致していなければならない。一致していない場合は、Fatal error となる。
PHP Fatal error: Uncaught ValueError: Array sizes are inconsistent in ~

sort_order
SORT_ASC昇順にソート
SORT_DESC降順にソート
sort_flags
SORT_REGULARアイテムを通常通り比較します (型を変更しません)。
SORT_NUMERICアイテムを数値として比較します。
SORT_STRINGアイテムを文字列として比較します。
SORT_LOCALE_STRING現在のロケールを考慮して、アイテムを文字列として比較します。利用するロケールは setlocale() で変更できます。
SORT_NATURALnatsort() と同様の「自然順」で、アイテムを文字列として比較します。
SORT_FLAG_CASESORT_STRING や SORT_NATURAL と (ビット OR で) 組み合わせて、 大文字小文字を区別しない文字列のソートを指定します。

戻り値
成功した場合に true を、失敗した場合に false を返します。

array_combine(array $keys, array $values): array

keys 配列の値をキーとして、また values 配列の値を対応する値として生成した 配列 を作成します。
PHP 8.0.0 以降では、keys および values の要素数が一致しなかった場合は ValueError がスローされます。 それより前のバージョンでは、 E_WARNING が発生していました。

コールバックにクラスメソッドを使用する

class MyCallback {
	const TAX = 10;

	public function tax_included($n) {
		return floor($n * (1 + self::TAX / 100));
	}
}

$cb = new MyCallback();

$arr = array(1000, 2000, 3000, 10000);

var_dump( array_map( array($cb, 'tax_included'), $arr ) );
//または↓
var_dump( array_map( [$cb, 'tax_included'], $arr ) );

イテレータ関数

current()
reset()
next()
prev()
end()
each()
key()

イテレーターでは配列のコピーを作成しない。大きな配列などでメモリを節約したい場合に便利です。

配列ソート用の関数

効果昇順降順ユーザー定義の順序
値によるソートの後、0から始まる数値インデックスを付け直すsort(array)rsort(array)usort(array, callable)
値によるソートasort(array)arsort(array)uasort(array, callable)
キーによるソートksort(array)krsort(array)uksort(array, callable)

※ sort() rsort() usort() は、インデックス配列対象

sort(array &$array, int $flags = SORT_REGULAR): bool

配列を昇順にソートする。新しいキーを降り直す。

フラグ
SORT_REGULAR通常通りに項目を比較します。
SORT_NUMERIC数値として項目を比較します。
SORT_STRING文字列として項目を比較します。
SORT_LOCALE_STRING現在のロケールに基づいて、文字列として項目を比較します。比較に使うロケールは、setlocale() 関数で変更できます。
SORT_NATURAL要素の比較を文字列として行い、 natsort() と同様の「自然順」で比較します。
SORT_FLAG_CASESORT_STRING や SORT_NATURAL と (ビットORで) 組み合わせて使い、 文字列のソートで大文字小文字を区別しないようにします。

戻り値
常にtrue を返す。

rsort(array &$array, int $flags = SORT_REGULAR): bool

配列を降順にソートする。新しいキーを降り直す。

戻り値
常にtrue を返す。

asort(array &$array, int $flags = SORT_REGULAR): bool

配列のキーと要素との関係を維持しつつ、 array を昇順にソートします。

natsort(array &$array): bool

“自然順”アルゴリズムで配列をソートする。

natcasesort(array &$array): bool

“自然順”アルゴリズムで配列をソートする。大文字小文字を区別しない。

usort(array &$array, callable $callback): bool

ユーザー定義の比較関数を使用して、配列を値でソートする。
比較関数は、最初の引数と二番目の引数の比較結果を返します。最初の引数のほうが二番目の引数より大きい場合は正の数を、二番目の引数と等しい場合はゼロを、そして二番目の引数より小さい場合は負の数を返す必要があります。
無名関数(クロージャー)を使う場合も多い。

//小さい順に並べ替える
function cmp($a, $b)
{
    if ($a == $b) {
        return 0;
    }
    return ($a < $b) ? -1 : 1;

		//こっちの方がシンプル
		//return ($a == $b) ? 0 : ($a < $b ? -1 : 1);
}

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

usort($a, "cmp");

foreach ($a as $key => $value) {
    echo "$key: $value\n";
}

宇宙船演算子を使ってシンプルに

function cmp($a, $b)
{
    return $a <=> $b;
}

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

usort($a, "cmp");

foreach ($a as $key => $value) {
    echo "$key: $value\n";
}

分割代入

配列の要素を個々の変数に代入する。
ブラケットによる分割は7.1から導入された。それ以前の環境ではlist関数を使う。

$data = [1,2,3,4,5];
[$a, $b, $c, $d, $e] = $data;

//一部の要素を切り捨てる インデックス0,2の要素をスキップする
[, $a, , $b, $c] = $data;

//ダミー変数 $_ を使う $_は任意の変数 スキップされるわけではなく$_という変数が存在する
[$_, $a, $_, $b, $c] = $data;

//インデックス値 => 変数 
[1 => $a, 3 => $b] = $data;

print $a; //結果:2
print $b; //結果:4

//連想配列
$map = ['title' => '世界史', 'price' => 3500];
['title' => $title, 'price' => $price] = $map;
print $title; //結果:世界史
print $price; //結果:3500

foreach命令で分割代入

$menus = [
  ['ピザ', 2300],
  ['特製サラダ', 1900],
  ['ステーキ', 3200],
];
foreach($menus as [$item, $price]) {
  print "{$item}({$price}円)<br>";
}
/*実行結果
ピザ(2300円)
特製サラダ(1900円)
ステーキ(3200円)
*/

//連想配列
$menus = [
  [ 'item' => 'ピザ', 'price' => 2300 ],
  [ 'item' => '特製サラダ', 'price' => 1900 ],
  [ 'item' => 'ステーキ', 'price' => 3200 ],
];
foreach($menus as ['item' => $item, 'price' => $price]) {
  print "{$item}({$price}円)<br>";
}

/*実行結果
ピザ(2300円)
特製サラダ(1900円)
ステーキ(3200円)
*/