- PHP
PHP配列関数一覧|8.4/8.5新関数まで目的別に実行例つき
PHPの配列関数は公式マニュアルに93個ありますが、「生成・追加削除・検索・並べ替え・変換・集計・比較結合・ポインタ・分割代入」の目的で整理すると、必要な関数がすぐに引けます。 PHP 8.4 で array_find / array_find_key / array_any / array_all が、PHP 8.5 で array_first / array_last が加わり、「条件に合う最初の要素」「先頭・末尾の値」もループなしで書けるようになりました。
この記事では全関数を目的別の表に「追加バージョン」つきでまとめ、各関数を1行のコードと実行結果(PHP 8.4.21 で実行)で示します。結果は json_encode 形式で、[1,2] はリスト、{"1":2} はキーが連番でない配列です(キーが保持されるか振り直されるかが一目でわかります)。sort 系の戻り値や array_search の false 判定、foreach の参照が残る問題も実際の出力・エラー文で確認します。バージョンは公式サイトで確認した 2026年9月時点の情報です(最新 8.5.11、8.4 系 8.4.26、8.6 は RC2 で正式版は 2026年11月予定)。
PHP配列関数の早見表(目的別・追加バージョンつき)
「追加」が空欄の関数は PHP 4 からあるものです。「書換」は引数の配列そのものを書き換える関数で、戻り値に結果は入りません。
| 目的 | 関数 | 追加 | 何をするか |
|---|---|---|---|
| 生成 | [] / array() |
5.4 | 配列リテラル([] は 5.4 から) |
| 生成 | range |
連番・文字の並び(8.3 からステップ 0 は ValueError) | |
| 生成 | array_fill / array_fill_keys |
/ 5.2 | 同じ値で n 個埋める/キー一覧から初期値つき連想配列 |
| 生成 | array_combine / array_pad |
5.0 / | キー配列と値配列から連想配列/指定長まで埋める |
| 生成 | compact / explode / str_split |
/ / 5.0 | 変数から/文字列から配列を作る |
| 追加・削除 | array_push / array_unshift |
末尾/先頭に追加(戻り値は要素数。書換) | |
| 追加・削除 | array_pop / array_shift |
末尾/先頭を取り出す(array_shift は数値キー振り直し。書換) |
|
| 追加・削除 | unset($a[$k]) |
キー指定で削除(詰めない。詰めるなら array_values) |
|
| 追加・削除 | array_splice / array_slice |
位置指定で削除・置換・挿入(書換)/一部を取り出す | |
| 追加・削除 | array_filter / array_unique |
条件で残す/重複を除く(どちらもキー保持) | |
| 検索・判定 | in_array |
値があるか(第3引数 true で型も比較) |
|
| 検索・判定 | array_search |
値からキー(なければ false。!== で判定) |
|
| 検索・判定 | array_key_exists / isset |
キーがあるか(isset は値が null だと false) |
|
| 検索・判定 | array_find / array_find_key |
8.4 | 条件を満たす最初の値/キー(なければ null) |
| 検索・判定 | array_any / array_all |
8.4 | 1つでも/すべて条件を満たすか |
| 検索・判定 | array_key_first / array_key_last |
7.3 | 先頭・末尾のキー(空なら null) |
| 検索・判定 | array_first / array_last |
8.5 | 先頭・末尾の値(空なら null) |
| 検索・判定 | array_is_list |
8.1 | 0 から連番のリストか |
| 検索・判定 | count / sizeof / empty |
要素数(COUNT_RECURSIVE で入れ子も)/空か |
|
| 並べ替え | sort / rsort |
値で昇順/降順(キー振り直し。書換) | |
| 並べ替え | asort / arsort / ksort / krsort |
値で/キーで並べ替え、キー保持(書換) | |
| 並べ替え | usort / uasort / uksort |
比較関数で(8.0 から安定ソート。書換) | |
| 並べ替え | natsort / natcasesort |
自然順(img2 が img10 より前。書換) | |
| 並べ替え | array_multisort |
複数配列・複数列で並べ替え(書換) | |
| 並べ替え | shuffle / array_rand / array_reverse |
ランダム化/ランダムにキー選択/逆順 | |
| 変換・写像 | array_map |
各要素に関数を適用した新しい配列(1配列ならキー保持) | |
| 変換・写像 | array_walk / array_walk_recursive |
/ 5.0 | 各要素を参照で書き換える(書換) |
| 変換・写像 | array_reduce |
1つの値に畳み込む | |
| 変換・写像 | array_column |
5.5 | 行配列から列を抜き出す・キーを付け替える |
| 変換・写像 | array_values / array_keys / array_flip |
値だけ(キー振り直し)/キーだけ/キーと値を交換 | |
| 変換・写像 | array_change_key_case / implode |
キーの大小文字/文字列に | |
| 変換・写像 | iterator_to_array / json_decode |
5.1 / 5.2 | Traversable を配列に/JSON を配列に(第2引数 true) |
| 集計 | array_sum / array_product / max / min / array_count_values |
/ 5.1 / / / | 合計/積/最大/最小/出現回数(array_sum は 8.3 から非数値に警告) |
| 比較・結合 | array_diff / array_diff_key / array_diff_assoc |
/ 5.1 / | 差集合(値/キー/両方) |
| 比較・結合 | array_intersect / _key / _assoc |
/ 5.1 / | 共通部分(値/キー/両方) |
| 比較・結合 | array_udiff / array_uintersect ほか u 系 |
5.0 | 比較関数つき(_ukey は 5.1) |
| 比較・結合 | array_merge / array_merge_recursive |
結合(数値キー振り直し、文字列キーは後勝ち) | |
| 比較・結合 | array_replace / array_replace_recursive |
5.3 | キーで置き換え(数値キーも保持) |
| 比較・結合 | + / ...(スプレッド) |
/ 7.4 | 左優先で結合/展開して結合(文字列キーは 8.1 から) |
| 比較・結合 | array_chunk / == / === |
n 個ずつ分割/同じキーと値か/順序と型まで同じか | |
| ポインタ | current / key / next / prev / reset / end |
内部ポインタの操作(each は 8.0 で削除) |
|
| 分割代入 | list() / [$a, $b] = / extract |
7.1 | 分割代入([] 構文とキー指定は 7.1 から)/変数に展開 |
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「PHP配列関数一覧|8.4/8.5新関数まで目的別に実行例つき」
配列を作る(生成)
range(1, 5) // => [1,2,3,4,5]
range('a', 'e') // => ["a","b","c","d","e"]
range(5, 1, 2) // => [5,3,1]
range(0, 1, 0.25) // => [0.0,0.25,0.5,0.75,1.0]
array_fill(0, 3, 'x') // => ["x","x","x"]
array_fill_keys(['a', 'b'], 0) // => {"a":0,"b":0}
array_combine(['id', 'name'], [7, 'pen']) // => {"id":7,"name":"pen"}
array_pad([1, 2], 4, 0) // => [1,2,0,0]
$x = 1; $y = 2; $r = compact('x', 'y'); // => $r={"x":1,"y":2}
range は 8.3 で仕様が整理され、ステップ 0 は ValueError: range(): Argument #3 ($step) cannot be 0 になります。小数ステップなら float の配列です。
要素を追加・削除する
$a = [1, 2]; $n = array_push($a, 3, 4); // => $n=4 $a=[1,2,3,4]
$a = [1, 2, 3]; $v = array_shift($a); // => $v=1 $a=[2,3]
$a = [5 => 'a', 6 => 'b']; array_shift($a); // => $a=["b"] ※数値キーは 0 から振り直し
$a = ['a', 'b', 'c']; unset($a[1]); // => $a={"0":"a","2":"c"} ※穴が空く
$a = ['a', 'b', 'c']; unset($a[1]); $a = array_values($a); // => $a=["a","c"]
$a = [1, 2, 3, 4, 5]; $cut = array_splice($a, 1, 2); // => $cut=[2,3] $a=[1,4,5]
$a = [1, 2, 3, 4, 5]; array_splice($a, 1, 2, ['x', 'y']); // => $a=[1,"x","y",4,5]
array_slice([1, 2, 3, 4, 5], 1, 3, true) // => {"1":2,"2":3,"3":4} ※preserve_keys
array_unique([1, '1', 2, 2.0, 'a', 'A']) // => {"0":1,"2":2,"4":"a","5":"A"}
array_filter([0, 1, '', null, 'a', false, [], '0']) // => {"1":1,"4":"a"} ※"0" も落ちる
array_filter([1, 2, 3, 4], fn($v) => $v % 2 === 0) // => {"1":2,"3":4}
array_filter(['a' => 1, 'b' => 2], fn($k) => $k !== 'a', ARRAY_FILTER_USE_KEY) // => {"b":2}
array_filter(['a' => 1, 'b' => 2], fn($v, $k) => $k === 'b' && $v > 1, ARRAY_FILTER_USE_BOTH) // => {"b":2}
array_filter と array_unique はキーを保持するので、JSON にリストとして出すなら array_values で詰めます。コールバックなしの array_filter は "0" や 0 も取り除くため、「空文字と null だけ除く」なら fn($v) => $v !== null && $v !== '' と書きます。
要素を探す・判定する(8.4 の array_find を含む)
in_array('1', [1, 2, 3]) // => true ※緩い比較
in_array('1', [1, 2, 3], true) // => false ※厳密比較
in_array(0, ['a', 'b']) // => false ※8.0 から数値と文字列の比較が変更
array_search('a', ['a', 'b', 'c']) // => 0 ※0 は falsy
array_search('z', ['a', 'b', 'c']) // => false
array_key_exists('k', ['k' => null]) // => true
isset(['k' => null]['k']) // => false
array_key_first(['x' => 1, 'y' => 2]) // => "x"
count([1, [2, 3]], COUNT_RECURSIVE) // => 4
// PHP 8.4 の新関数(コールバックは値・キーの順で受け取る)
array_find([3, 8, 12, 20], fn($v) => $v > 10) // => 12
array_find([3, 8], fn($v) => $v > 10) // => null
array_find_key(['a' => 3, 'b' => 12], fn($v) => $v > 10) // => "b"
array_find(['x' => 1, 'y' => 2], fn($v, $k) => $k === 'y') // => 2
array_any([1, 2, 3], fn($v) => $v > 2) // => true
array_all([1, 2, 3], fn($v) => $v > 0) // => true
array_all([], fn($v) => false) // => true ※空配列は「すべて満たす」
array_any([], fn($v) => true) // => false
array_find は「条件に合う最初の値」を返し、なければ null です。以前は array_filter の結果に reset を組み合わせていた処理が 1 行になります。値そのものが null の要素と区別したいときは array_find_key でキーを取ります。
PHP 8.5 の array_first / array_last は「先頭・末尾の値(空なら null)」を返します。8.4 では次のポリフィルで同じ挙動を確認できます(8.5 では組み込みなので、function_exists で守っておくとそのまま移行できます)。
<?php
if (!function_exists('array_first')) {
function array_first(array $array): mixed { return $array === [] ? null : $array[array_key_first($array)]; }
function array_last(array $array): mixed { return $array === [] ? null : $array[array_key_last($array)]; }
}
var_dump(array_first(['x' => 10, 'y' => 20]), array_last([1, 2, 3]), array_first([]));
// int(10) int(3) NULL
| やりたいこと | 使う関数 | 戻り値 |
|---|---|---|
| 値があるかだけ知りたい | in_array($v, $a, true) |
bool |
| 値の位置(キー)が欲しい | array_search($v, $a, true) |
キー、なければ false |
| 条件に合う最初の要素が欲しい | array_find($a, $fn)(8.4) |
値、なければ null |
| 条件に合う要素をすべて欲しい | array_filter($a, $fn) |
配列(キー保持) |
| 1 つでも/すべて満たすか | array_any / array_all(8.4) |
bool |
| キーがあるか(値が null でも) | array_key_exists($k, $a) |
bool |
並べ替える
sort 系は引数の配列を直接書き換え、戻り値は常に true です(8.2 で戻り値の型が true になりました)。$sorted = sort($a) と書くと $sorted には true が入ります。
$a = [3, 1, 2]; $r = sort($a); // => $r=true $a=[1,2,3]
$a = ['b' => 2, 'a' => 3, 'c' => 1]; asort($a); // => $a={"c":1,"b":2,"a":3}
$a = ['b' => 2, 'a' => 3, 'c' => 1]; ksort($a); // => $a={"a":3,"b":2,"c":1}
$a = ['b' => 2, 'a' => 3, 'c' => 1]; sort($a); // => $a=[1,2,3] ※キーが消える
$a = [10, 9, 2, '10', 1]; sort($a); // => $a=[1,2,9,10,"10"]
$a = ['img12', 'img10', 'img2']; sort($a, SORT_NATURAL); // => $a=["img2","img10","img12"]
$a = ['img12', 'img10', 'img2']; natsort($a); // => $a={"2":"img2","1":"img10","0":"img12"}
$a = [[3, 'c'], [1, 'a'], [2, 'b']]; usort($a, fn($x, $y) => $x[0] <=> $y[0]); // => $a=[[1,"a"],[2,"b"],[3,"c"]]
$a = ['x' => 3, 'y' => 1]; uasort($a, fn($p, $q) => $p <=> $q); // => $a={"y":1,"x":3}
$d = [3, 1, 2]; $n = ['c', 'a', 'b']; array_multisort($d, $n); // => $d=[1,2,3] $n=["a","b","c"]
mt_srand(42); $a = [1, 2, 3, 4, 5]; shuffle($a); // => $a=[5,1,2,4,3] ※実行ごとに変わる
usort は 8.0 から安定ソートで、同じ順位の要素は元の順序を保ちます。複数列の並べ替えは、配列同士を <=> で比べると簡潔です。
<?php
$rows = [['n' => 'b', 'v' => 1], ['n' => 'a', 'v' => 1], ['n' => 'c', 'v' => 0], ['n' => 'd', 'v' => 1]];
usort($rows, fn($x, $y) => $x['v'] <=> $y['v']);
echo implode(' ', array_column($rows, 'n')), "\n"; // v が同じ b, a, d の順序は元のまま
$items = [['n' => 'pen', 'p' => 300], ['n' => 'ink', 'p' => 100], ['n' => 'pad', 'p' => 200]];
usort($items, fn($a, $b) => [$b['p'], $a['n']] <=> [$a['p'], $b['n']]); // 価格の降順、同額なら名前の昇順
array_multisort(array_column($items, 'p'), SORT_DESC, $items); // 同じことを array_multisort で
echo json_encode(array_column($items, 'n')), "\n";
c b a d
["pen","pad","ink"]
比較関数で $x > $y のように bool を返すと Deprecated: usort(): Returning bool from comparison function is deprecated... と表示されます。<=> で -1 / 0 / 1 を返すのが定石です。
変換・写像する(array_map / array_walk / array_reduce / array_column)
array_map(fn($v) => $v * 2, ['a' => 1, 'b' => 2]) // => {"a":2,"b":4} ※1配列ならキー保持
array_map(fn($x, $y) => $x . $y, [1, 2], ['a', 'b']) // => ["1a","2b"] ※複数配列はキー振り直し
array_map(null, [1, 2], ['a', 'b']) // => [[1,"a"],[2,"b"]] ※zip
$a = [1, 2, 3]; array_walk($a, function (&$v, $k) { $v = $v * 10; }); // => $a=[10,20,30]
$a = [1, [2, 3]]; array_walk_recursive($a, function (&$v) { $v++; }); // => $a=[2,[3,4]]
array_reduce([1, 2, 3, 4], fn($carry, $v) => $carry + $v, 0) // => 10
array_reduce([], fn($c, $v) => $c + $v) // => null ※初期値がないと null
array_column([['id' => 1, 'n' => 'pen'], ['id' => 2, 'n' => 'ink']], 'n') // => ["pen","ink"]
array_column([['id' => 1, 'n' => 'pen'], ['id' => 2, 'n' => 'ink']], 'n', 'id') // => {"1":"pen","2":"ink"}
array_column([['id' => 1, 'n' => 'pen'], ['id' => 2, 'n' => 'ink']], null, 'id') // => {"1":{"id":1,"n":"pen"},"2":{"id":2,"n":"ink"}}
iterator_to_array((function () { yield 1; yield 2; })(), false) // => [1,2]
| 観点 | array_map |
foreach |
|---|---|---|
| 結果 | 新しい配列を返す(元は変えない) | 何でも書ける(副作用も可) |
| キー | 1 配列ならそのまま、複数配列なら振り直し | as $k => $v で常に使える |
| 途中で止める | できない | break / continue |
| 向いている処理 | 各要素を変換して同じ長さの配列を返す | グループ化、条件分岐、複数の結果を組み立てる |
「1 対 1 の変換」は array_map、それ以外は foreach と考えると迷いません。キーも使いたい変換は array_map(fn($k, $v) => "$k:$v", array_keys($a), $a) と 2 配列を渡します。array_walk は元の配列を参照で書き換えたいときに使い、引数に & を付けないと元の配列は変わりません。
集計する
array_sum([1, 2, 3.5]) // => 6.5
array_product([2, 3, 4]) // => 24
max(...[3, 7, 5]) // => 7 ※スプレッドで可変長引数に
array_count_values(['a', 'b', 'a', 1, '1']) // => {"a":2,"b":1,"1":2}
round(array_sum([80, 90, 85]) / count([80, 90, 85]), 1) // => 85.0
array_sum([1, 'abc', 2]) は 8.3 から Warning: array_sum(): Addition is not supported on type string と表示され、結果は 3 です。数値以外が混ざりうるデータは array_filter($a, 'is_numeric') で先に絞ります。
比較・差分・結合・分割する
array_diff([1, 2, 3, 4], [2, 4]) // => {"0":1,"2":3} ※左にだけある値
array_diff_key(['a' => 1, 'b' => 2], ['a' => 9]) // => {"b":2}
array_intersect([1, 2, 3], [2, 3, 4]) // => {"1":2,"2":3}
array_intersect_key(['a' => 1, 'b' => 2, 'c' => 3], ['a' => 0, 'c' => 0]) // => {"a":1,"c":3}
array_merge(['a' => 1, 'b' => 2], ['b' => 9, 'c' => 3]) // => {"a":1,"b":9,"c":3} ※後勝ち
array_merge([5 => 'x'], [5 => 'y']) // => ["x","y"] ※数値キー振り直し
[5 => 'x'] + [5 => 'y', 6 => 'z'] // => {"5":"x","6":"z"} ※左勝ち・キー保持
array_replace([1, 2, 3], [1 => 'b'], [3 => 'd']) // => [1,"b",3,"d"]
[...['a' => 1, 'b' => 2], ...['b' => 9, 'c' => 3]] // => {"a":1,"b":9,"c":3} ※8.1 から文字列キー可
array_merge(...[[1], [2], [3]]) // => [1,2,3] ※配列の配列を平坦化
array_chunk([1, 2, 3, 4, 5], 2) // => [[1,2],[3,4],[5]]
['a' => 1, 'b' => 2] == ['b' => 2, 'a' => 1] // => true ※順序は問わない
['a' => 1, 'b' => 2] === ['b' => 2, 'a' => 1] // => false ※=== は順序も比較
| 結合方法 | 同じ文字列キー | 数値キー | 使いどころ |
|---|---|---|---|
array_merge |
後勝ち | 振り直す | リストの連結、設定の上書き |
+ |
左勝ち | 保持 | 「既定値 + 入力」で既定値を優先したいとき |
array_replace |
後勝ち | 保持 | 数値キーを保ったまま上書き |
[...$a, ...$b] |
後勝ち(8.1〜) | 振り直す | array_merge と同じ結果を短く |
既定値と入力を合成するなら [...$defaults, ...$input](入力が優先)、未知のキーを落とすなら array_intersect_key($merged, $defaults) を組み合わせます。
内部ポインタを操作する
$a = ['x' => 1, 'y' => 2, 'z' => 3]; $c = current($a); $k = key($a); // => $c=1 $k="x"
$a = ['x' => 1, 'y' => 2, 'z' => 3]; $e = end($a); $k = key($a); // => $e=3 $k="z"
$a = [1, 2, 3]; next($a); $c = current($a); next($a); prev($a); $p = current($a); $r = reset($a); // => $c=2 $p=2 $r=1
$a = []; $e = end($a); // => $e=false
先頭・末尾の値を取るだけなら、ポインタを動かさない array_key_first / array_key_last(7.3)や array_first / array_last(8.5)が読みやすいです。end($a) は空配列で false を返すため、値に false が入りうる配列では区別できません。each() は 8.0 で削除され、Error: Call to undefined function each() になります。
分割代入・compact・extract
[$a, $b] = [1, 2]; // => $a=1 $b=2
['x' => $x, 'y' => $y] = ['x' => 10, 'y' => 20]; // => $x=10 $y=20 ※キー指定(7.1〜)
$a = 1; $b = 2; [$a, $b] = [$b, $a]; // => $a=2 $b=1 ※入れ替え
[$a, $b] = [1]; // => $a=1 $b=null ※Warning: Undefined array key 1
foreach ([[1, 'a'], [2, 'b']] as [$id, $name]) { $r[] = "$id:$name"; } // => $r=["1:a","2:b"]
$n = extract(['p' => 1, 'q' => 2]); // => $n=2 $p=1 $q=2
$p = 1; $n = extract(['p' => 9], EXTR_SKIP); // => $p=1 ※既存の変数は守る
関数から複数の値を返すときは配列を返して [$lo, $hi] = minMax($nums); と受け取るのが PHP らしい書き方です。extract は外部から来た配列に使うと意図しない変数が定義されるため、キーを絞った配列にだけ使います。
実務でよく書く配列処理(実行結果つき)
<?php
declare(strict_types=1);
$items = [
['id' => 3, 'name' => 'ノート', 'category' => '文具', 'price' => 200, 'qty' => 5],
['id' => 1, 'name' => 'ペン', 'category' => '文具', 'price' => 120, 'qty' => 10],
['id' => 2, 'name' => 'ケーブル', 'category' => '備品', 'price' => 800, 'qty' => 2],
['id' => 4, 'name' => 'マウス', 'category' => '備品', 'price' => 1500, 'qty' => 1],
];
$j = fn($v) => json_encode($v, JSON_UNESCAPED_UNICODE);
echo '1 ', $j(array_column($items, null, 'id')[2]), "\n"; // id で引ける辞書
echo '2 ', array_sum(array_map(fn($r) => $r['price'] * $r['qty'], $items)), "\n"; // 合計金額
$grouped = [];
foreach ($items as $row) { $grouped[$row['category']][] = $row['name']; } // グループ化は foreach
echo '3 ', $j($grouped), "\n";
echo '4 ', $j(array_find($items, fn($r) => $r['qty'] <= 1)['name'] ?? null), "\n"; // 8.4
array_walk($items, function (array &$row): void { $row['subtotal'] = $row['price'] * $row['qty']; });
echo '5 ', $j(array_column($items, 'subtotal', 'name')), "\n";
1 {"id":2,"name":"ケーブル","category":"備品","price":800,"qty":2}
2 5300
3 {"文具":["ノート","ペン"],"備品":["ケーブル","マウス"]}
4 "マウス"
5 {"ノート":1000,"ペン":1200,"ケーブル":1600,"マウス":1500}
よくあるつまずきと実際のエラー文
| 状況 | 実行結果(PHP 8.4.21) | 直し方 |
|---|---|---|
if (array_search('red', $colors)) |
先頭(キー 0)が見つかっても偽になる | !== false で判定する |
$sorted = sort($a); |
$sorted は bool(true)、並ぶのは $a |
sort($a); の後に $a を使う |
usort($a, fn($x, $y) => $x > $y) |
Deprecated: usort(): Returning bool from comparison function is deprecated... |
$x <=> $y を返す |
array_combine(['a', 'b'], [1]) |
ValueError: array_combine(): Argument #1 ($keys) and argument #2 ($values) must have the same number of elements |
要素数をそろえる |
count(null) |
TypeError: count(): Argument #1 ($value) must be of type Countable|array, null given |
count($a ?? []) |
echo $a['y'];(キーなし) |
Warning: Undefined array key "y" |
$a['y'] ?? '既定値' |
$a = null; echo $a['x']; |
Warning: Trying to access array offset on null |
$a['x'] ?? null |
foreach の参照変数が残るのも定番のつまずきです。1 回目のループで &$v を使い、2 回目を値で回すと、最後の要素が上書きされます。
<?php
$a = [1, 2, 3];
foreach ($a as &$v) { $v *= 2; }
foreach ($a as $v) {} // $v はまだ $a[2] への参照
print_r($a); // => [2, 4, 4] 最後の要素が 4 になる
// 直し方:1 回目のループの直後に unset($v); を入れると [2, 4, 6] になる
もう 1 つ、PHP の配列は値として代入・引数渡しされる(コピーオンライト)ことも押さえておきます。$b = $a; $b[] = 3; としても $a は [1,2] のままで、呼び出し元を書き換えたいときだけ function f(array &$arr) と参照にします。
array_* と iterator_*、Collection ライブラリの位置づけ
array_* 関数は配列専用で、ジェネレータや Traversable には iterator_to_array / iterator_count で橋渡しします。大量データを少しずつ処理するならジェネレータ(yield)+ foreach、メモリに載る大きさなら array_* で十分です。Laravel の Collection や doctrine/collections は、array_map → array_filter → array_values の連鎖をメソッドチェーンで読みやすくするもので、内部では同じ配列関数が動いています。標準関数の挙動(キーの扱い、書き換えの有無)を押さえておくと、ライブラリの挙動も推測できます。
よくある質問
Q. array_find を 8.3 以前でも使いたいときは?
A. foreach ($a as $k => $v) { if ($fn($v, $k)) return $v; } return null; で同じ動作になります。Composer の polyfills/array-find パッケージもあり、8.4 に上げると組み込み関数へそのまま切り替わります。
Q. 連想配列を値で並べ替えたら、キーが消えました。
A. sort / rsort / usort はキーを振り直します。キーを保ったまま値で並べ替えるには asort / arsort / uasort を使ってください。
まとめ
- 配列関数は「目的別」に引く:生成・追加削除・検索・並べ替え・変換・集計・比較結合・ポインタ・分割代入の分類で必要な関数がすぐ見つかります。
- 8.4 の
array_find/array_find_key/array_any/array_all、8.5 のarray_first/array_lastで、「条件に合う最初の要素」「先頭・末尾の値」がループなしで書けます。 sort系は引数を書き換えてtrueを返すため、戻り値ではなく元の変数を使います。連想配列のキーを保つならasort/uasortです。array_searchは!== false、issetは null を区別しないなど、戻り値の型を意識すると判定ミスが防げます。- 1 対 1 の変換は
array_map、グループ化や分岐はforeach、元配列の書き換えはarray_walkと使い分けます。 foreachの参照はunset($v)で切る、配列は値渡しという基本で、予想外の書き換えがなくなります。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「PHP配列関数一覧|8.4/8.5新関数まで目的別に実行例つき」
株式会社RJCでは、PHP の配列操作のような基本を実行結果で確かめながら、プロジェクトの中で仲間と学び合っています。こうした知識を共有しながら、日々技術を磨いています。
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。