PHPで配列に要素を追加するとき、「どの方法を使えばいいのか」「それぞれ何が違うのか」と迷ったことはありませんか?
PHPには配列へ要素を追加する方法が複数あり、追加する位置(末尾・先頭・途中)や用途(単一要素・複数要素・配列同士の結合)によって最適な手段が異なります。
この記事では、PHPの配列追加に関する全パターンを体系的に整理し、コード例・実行結果付きで徹底解説します。
この記事でわかること
- 配列の末尾に追加する2つの方法(
$arr[] と array_push())
- 配列の先頭に追加する方法(
array_unshift())
- 特定の位置に挿入する方法(
array_splice())
- 配列同士を結合する3つの方法(
array_merge()・スプレッド演算子・+ 演算子)
- 連想配列への要素追加と注意点
- よくあるミスと対処法
1. 配列の末尾に追加する方法
配列の末尾に要素を追加するのは、もっとも頻繁に使う操作です。PHPでは主に2つの方法があります。
1-1. $arr[] = 値(最もシンプル)
もっとも基本的で高速な方法が、角括弧構文($arr[] = 値)です。配列の末尾に1つの要素を追加します。
PHP
$fruits = ['apple', 'banana'];
// 末尾に要素を追加
$fruits[] = 'cherry';
$fruits[] = 'date';
echo '追加後の配列:' . PHP_EOL;
print_r($fruits);
実行結果
追加後の配列:
Array
(
[0] => apple
[1] => banana
[2] => cherry
[3] => date
)
$arr[] は関数呼び出しのオーバーヘッドがないため、1つの要素を追加するだけなら最も高速な方法です。実務でもっとも多用されるパターンです。
数値キーは自動的にインクリメントされます。既に存在するキーの最大値 + 1 が新しいキーとして割り当てられます。
PHP
// キーを明示的に指定した配列
$arr = [
5 => 'A',
10 => 'B',
];
$arr[] = 'C';
print_r($arr);
// [5] => A, [10] => B, [11] => C
// キー 10 の次なので 11 が割り当てられる
1-2. array_push()(複数要素を一度に追加)
array_push() は、配列の末尾に1つ以上の要素をまとめて追加する関数です。
PHP
$colors = ['red'];
// 1つの要素を追加
array_push($colors, 'blue');
// 複数の要素を一度に追加
array_push($colors, 'green', 'yellow', 'purple');
print_r($colors);
実行結果
Array
(
[0] => red
[1] => blue
[2] => green
[3] => yellow
[4] => purple
)
array_push() の構文
PHP
array_push($array, $value1, $value2, ...);
// 引数:
// $array - 追加先の配列(参照渡し)
// $value1 - 追加する値(1つ以上)
// 戻り値: 追加後の配列の要素数(int)
注意:array_push() の戻り値は追加後の要素数(整数)であり、配列そのものではありません。戻り値を変数に代入して配列として使おうとすると意図しない動作になります。
1-3. $arr[] vs array_push() の使い分け
どちらも末尾への追加ですが、パフォーマンスと用途に違いがあります。
| 比較項目 |
$arr[] = 値 |
array_push() |
| 追加できる数 |
1つずつ |
複数を一度に |
| 速度 |
高速(関数呼び出しなし) |
やや遅い(関数呼び出しあり) |
| 戻り値 |
なし |
追加後の要素数(int) |
| 可読性 |
シンプル |
意図が明確 |
| 推奨場面 |
1要素の追加 |
複数要素の同時追加 |
実際にパフォーマンスの違いを確認してみましょう。
PHP
// $arr[] のベンチマーク
$arr1 = [];
$start = microtime(true);
for ($i = 0; $i < 100000; $i++) {
$arr1[] = $i;
}
$time1 = microtime(true) - $start;
// array_push() のベンチマーク
$arr2 = [];
$start = microtime(true);
for ($i = 0; $i < 100000; $i++) {
array_push($arr2, $i);
}
$time2 = microtime(true) - $start;
echo '$arr[]: ' . round($time1 * 1000, 2) . ' ms' . PHP_EOL;
echo 'array_push: ' . round($time2 * 1000, 2) . ' ms' . PHP_EOL;
実行結果(例)
$arr[]: 3.42 ms
array_push: 5.18 ms
使い分けのポイント:1つの要素を追加するだけなら $arr[] を使いましょう。複数の要素をまとめて追加したい場合は array_push() が便利です。10万回のループでも数ミリ秒の差なので、通常の開発では可読性を優先して問題ありません。
2. 配列の先頭に追加する方法
2-1. array_unshift()
array_unshift() は、配列の先頭に1つ以上の要素を追加する関数です。既存の数値キーは自動的に振り直されます。
PHP
$animals = ['dog', 'cat'];
// 先頭に1つ追加
array_unshift($animals, 'bird');
echo '1つ追加後:' . PHP_EOL;
print_r($animals);
// 先頭に複数追加
array_unshift($animals, 'fish', 'rabbit');
echo '複数追加後:' . PHP_EOL;
print_r($animals);
実行結果
1つ追加後:
Array
(
[0] => bird
[1] => dog
[2] => cat
)
複数追加後:
Array
(
[0] => fish
[1] => rabbit
[2] => bird
[3] => dog
[4] => cat
)
array_unshift() の構文
PHP
array_unshift($array, $value1, $value2, ...);
// 引数:
// $array - 追加先の配列(参照渡し)
// $value1 - 先頭に追加する値(1つ以上)
// 戻り値: 追加後の配列の要素数(int)
注意:array_unshift() は既存の数値キーを0から振り直します。文字列キー(連想配列のキー)は変更されません。大きな配列に対して頻繁に呼ぶと、キーの再割り当てによりパフォーマンスに影響する場合があります。
2-2. 連想配列の先頭に追加するテクニック
連想配列の場合、array_unshift() では文字列キーを指定できません。代わりに array_merge() や + 演算子を使います。
PHP
$user = [
'name' => '田中',
'email' => 'tanaka@example.com',
];
// 先頭に 'id' を追加
$user = ['id' => 1] + $user;
print_r($user);
実行結果
Array
(
[id] => 1
[name] => 田中
[email] => tanaka@example.com
)
3. 特定の位置に挿入する方法
3-1. array_splice()
array_splice() は配列の任意の位置に要素を挿入(または置換・削除)できる万能関数です。
array_splice() の構文
PHP
array_splice($array, $offset, $length, $replacement);
// 引数:
// $array - 対象の配列(参照渡し)
// $offset - 挿入・削除を開始する位置(0始まり)
// $length - 削除する要素数(0なら削除せずに挿入のみ)
// $replacement - 挿入する要素(配列で指定)
// 戻り値: 削除された要素の配列
要素を削除せずに「挿入だけ」したい場合は、$length に 0 を指定します。
PHP
$months = ['1月', '2月', '4月', '5月'];
// インデックス2の位置に '3月' を挿入(削除なし)
array_splice($months, 2, 0, ['3月']);
print_r($months);
実行結果
Array
(
[0] => 1月
[1] => 2月
[2] => 3月
[3] => 4月
[4] => 5月
)
複数の要素を同時に挿入することも可能です。
PHP
$nums = [1, 2, 6, 7];
// インデックス2の位置に 3, 4, 5 を挿入
array_splice($nums, 2, 0, [3, 4, 5]);
print_r($nums);
// [1, 2, 3, 4, 5, 6, 7]
3-2. 置換しながら挿入する
$length を0以外にすると、要素を削除しつつ新しい要素を挿入できます。
PHP
$languages = ['PHP', 'Ruby', 'Perl', 'Go'];
// インデックス1から2つ削除し、Python と Java を挿入
$removed = array_splice($languages, 1, 2, ['Python', 'Java']);
echo '削除された要素:' . PHP_EOL;
print_r($removed);
echo '変更後の配列:' . PHP_EOL;
print_r($languages);
実行結果
削除された要素:
Array
(
[0] => Ruby
[1] => Perl
)
変更後の配列:
Array
(
[0] => PHP
[1] => Python
[2] => Java
[3] => Go
)
array_splice() は元の配列を直接変更する(破壊的操作)ため、元の配列を保持したい場合は事前にコピーを取っておきましょう。
4. 配列同士を結合する方法
複数の配列を1つにまとめたい場面はよくあります。PHPでは3つの主要な方法があり、それぞれ挙動が異なります。
4-1. array_merge()(最も一般的)
array_merge() は2つ以上の配列を結合して新しい配列を返す関数です。もっとも広く使われている方法です。
PHP
$frontend = ['HTML', 'CSS', 'JavaScript'];
$backend = ['PHP', 'Python', 'Java'];
$all = array_merge($frontend, $backend);
print_r($all);
実行結果
Array
(
[0] => HTML
[1] => CSS
[2] => JavaScript
[3] => PHP
[4] => Python
[5] => Java
)
3つ以上の配列も一度に結合できます。
PHP
$a = [1, 2];
$b = [3, 4];
$c = [5, 6];
$merged = array_merge($a, $b, $c);
print_r($merged);
// [1, 2, 3, 4, 5, 6]
array_merge() は元の配列を変更せず新しい配列を返す非破壊的な関数です。数値キーは0からリセットされます。
4-2. スプレッド演算子 …(PHP 7.4以降)
PHP 7.4 で導入されたスプレッド演算子(...)を使うと、配列リテラル内で配列を展開できます。
PHP
$fruits = ['apple', 'banana'];
$vegetables = ['carrot', 'daikon'];
// スプレッド演算子で結合
$food = [...$fruits, ...$vegetables];
print_r($food);
実行結果
Array
(
[0] => apple
[1] => banana
[2] => carrot
[3] => daikon
)
スプレッド演算子の利点は、結合と同時に個別の要素を追加できることです。
PHP
$base = [1, 2, 3];
// 結合 + 個別要素の追加を一度に
$extended = [0, ...$base, 4, 5];
print_r($extended);
// [0, 1, 2, 3, 4, 5]
注意:PHP 8.1 未満では、スプレッド演算子は数値キーの配列のみ対応しています。文字列キーを含む連想配列に使うとエラーになります。PHP 8.1 以降は連想配列でも使用可能です。
4-3. 配列結合演算子 +(キー保持)
+ 演算子を使うと、キーを保持したまま配列を結合できます。同じキーが存在する場合は、左側(先に書いた方)の値が優先されます。
PHP
$defaults = [
'color' => 'blue',
'size' => 'medium',
'weight' => 'normal',
];
$custom = [
'color' => 'red',
'style' => 'bold',
];
// $custom の値を優先し、不足分を $defaults で補完
$result = $custom + $defaults;
print_r($result);
実行結果
Array
(
[color] => red
[style] => bold
[size] => medium
[weight] => normal
)
color は両方に存在しますが、左側の $custom の値(red)が優先されています。
実務Tips:+ 演算子は「デフォルト値の補完」に最適です。ユーザー指定のオプションを左側、デフォルト値を右側に書くことで、指定されたものはそのまま、未指定のものはデフォルト値で埋める処理を簡潔に書けます。
ただし、数値キーの配列では直感に反する挙動になるので注意が必要です。
PHP
$a = ['apple', 'banana']; // キー: 0, 1
$b = ['cherry', 'date']; // キー: 0, 1
$result = $a + $b;
print_r($result);
実行結果
Array
(
[0] => apple
[1] => banana
)
キーが重複しているため、左側の $a の値だけが残り、$b の要素は無視されます。数値キー配列の結合には array_merge() を使いましょう。
4-4. 結合方法の比較表
| 比較項目 |
array_merge() |
スプレッド演算子 … |
+ 演算子 |
| 数値キー |
0からリセット |
0からリセット |
保持(重複は左優先) |
| 文字列キー重複時 |
後の値で上書き |
後の値で上書き(PHP 8.1〜) |
先の値を保持 |
| 元の配列への影響 |
なし(新しい配列を返す) |
なし(新しい配列を返す) |
なし(新しい配列を返す) |
| 3つ以上の結合 |
可能 |
可能 |
可能(連鎖) |
| 主な用途 |
汎用的な結合 |
モダンな記法・柔軟な結合 |
デフォルト値の補完 |
5. 連想配列に要素を追加する方法
連想配列(文字列キーの配列)への追加は、インデックス配列とは少し異なる点があります。
5-1. $arr['key'] = 値(基本の追加方法)
連想配列に要素を追加するもっとも基本的な方法は、キーを直接指定する方法です。
PHP
$user = [
'name' => '山田太郎',
'age' => 30,
];
// 新しいキーで追加
$user['email'] = 'yamada@example.com';
$user['phone'] = '090-1234-5678';
print_r($user);
実行結果
Array
(
[name] => 山田太郎
日付未入力 => 30
[email] => yamada@example.com
[phone] => 090-1234-5678
)
注意:既に存在するキーに値を代入すると、上書きされます。追加ではなく更新になる点に注意してください。
PHP
$user = ['name' => '山田'];
// 同じキーに代入 → 上書き!
$user['name'] = '田中';
echo $user['name'];
// 田中(山田は上書きされた)
5-2. 存在チェックをしてから追加する
既存のキーを上書きしたくない場合は、array_key_exists() や isset() でチェックしてから追加します。
PHP
$config = [
'debug' => true,
'cache' => false,
];
// キーが存在しない場合のみ追加
if (!array_key_exists('timeout', $config)) {
$config['timeout'] = 30;
}
// 既存のキーは上書きしない
if (!array_key_exists('debug', $config)) {
$config['debug'] = false; // この行は実行されない
}
print_r($config);
実行結果
Array
(
[debug] => 1
[cache] =>
[timeout] => 30
)
Null合体演算子の活用:PHP 7.0 以降では、??=(Null合体代入演算子、PHP 7.4〜)を使うと、キーが未定義またはnullの場合のみ代入できます。
PHP
$config = ['debug' => true];
// キーが存在しない or null の場合のみ代入(PHP 7.4〜)
$config['debug'] ??= false; // 既存のため変更なし
$config['timeout'] ??= 30; // 未定義のため 30 が代入される
print_r($config);
// ['debug' => true, 'timeout' => 30]
5-3. array_merge() での連想配列結合と注意点
array_merge() で連想配列を結合すると、同じ文字列キーが存在する場合は後の配列の値で上書きされます。
PHP
$default = [
'host' => 'localhost',
'port' => 3306,
'charset' => 'utf8',
];
$custom = [
'host' => 'db.example.com',
'charset' => 'utf8mb4',
];
$config = array_merge($default, $custom);
print_r($config);
実行結果
Array
(
[host] => db.example.com
[port] => 3306
[charset] => utf8mb4
)
host と charset は後から指定した $custom の値で上書きされ、$default にしかない port はそのまま残っています。
| 方法 |
キー重複時の挙動 |
使い分け |
| array_merge() |
後の値で上書き |
カスタム設定でデフォルトを上書きしたい |
| + 演算子 |
先の値を保持 |
既存の値を守りつつ不足を補完したい |
6. よくあるミスと注意点
配列への要素追加で、初心者がハマりやすいポイントをまとめます。
6-1. array_push() の戻り値は要素数であり配列ではない
もっとも多いミスの一つです。array_push() は配列を返すのではなく、追加後の要素数(整数)を返します。
PHP(よくある間違い)
$fruits = ['apple'];
// ❌ 間違い: 戻り値を配列として代入してしまう
$fruits = array_push($fruits, 'banana');
var_dump($fruits);
// int(2) ← 配列ではなく要素数が入ってしまう!
PHP(正しい使い方)
$fruits = ['apple'];
// ✅ 正しい: 戻り値は代入しない(参照渡しで元の配列が変更される)
array_push($fruits, 'banana');
print_r($fruits);
// ['apple', 'banana']
6-2. + 演算子は同じキーを上書きしない
array_merge() と混同しやすいポイントです。
PHP
$a = ['x' => 1];
$b = ['x' => 2, 'y' => 3];
// + 演算子: 左側の値を保持
$result1 = $a + $b;
echo '+ 演算子: x = ' . $result1['x'] . PHP_EOL;
// x = 1($a の値が残る)
// array_merge(): 後の値で上書き
$result2 = array_merge($a, $b);
echo 'array_merge: x = ' . $result2['x'] . PHP_EOL;
// x = 2($b の値で上書き)
6-3. array_merge() は数値キーをリセットする
array_merge() で結合すると、数値キーは0から振り直されます。キーを維持したい場合は + 演算子を使います。
PHP
$a = [10 => 'A', 20 => 'B'];
$b = [30 => 'C', 40 => 'D'];
// array_merge(): キーがリセットされる
$merged = array_merge($a, $b);
print_r($merged);
// [0]=>A [1]=>B [2]=>C [3]=>D
// + 演算子: キーが維持される
$union = $a + $b;
print_r($union);
// [10]=>A [20]=>B [30]=>C [40]=>D
6-4. ループ内での array_merge() に注意
ループ内で繰り返し array_merge() を呼ぶと、パフォーマンスが大幅に低下する場合があります。
PHP(非推奨パターン)
// ❌ ループ内で array_merge() → 配列を毎回コピーするため遅い
$result = [];
foreach ($dataList as $data) {
$result = array_merge($result, $data);
}
PHP(推奨パターン)
// ✅ スプレッド演算子で一度に結合
$result = array_merge(...$dataList);
// ✅ または、ループ内では $arr[] を使う
$result = [];
foreach ($dataList as $data) {
foreach ($data as $item) {
$result[] = $item;
}
}
6-5. 多次元配列への要素追加
多次元配列(配列の中に配列がある場合)に要素を追加するケースも押さえておきましょう。
PHP
$users = [
['name' => '田中', 'age' => 25],
['name' => '山田', 'age' => 30],
];
// 新しいユーザーを追加
$users[] = ['name' => '佐藤', 'age' => 28];
// 既存のユーザーに項目を追加
$users[0]['email'] = 'tanaka@example.com';
print_r($users);
実行結果
Array
(
[0] => Array
(
[name] => 田中
日付未入力 => 25
[email] => tanaka@example.com
)
[1] => Array
(
[name] => 山田
日付未入力 => 30
)
[2] => Array
(
[name] => 佐藤
日付未入力 => 28
)
)
7. まとめ:PHP配列の要素追加 早見表
最後に、この記事で紹介したすべての方法を早見表にまとめます。
| 目的 |
方法 |
特徴 |
| 末尾に1つ追加 |
$arr[] = 値 |
最速・最シンプル |
| 末尾に複数追加 |
array_push() |
複数要素を一度に追加 |
| 先頭に追加 |
array_unshift() |
数値キーを自動振り直し |
| 任意の位置に挿入 |
array_splice() |
挿入・削除・置換を1つで |
| 配列の結合(汎用) |
array_merge() |
数値キーリセット・文字列キーは後優先 |
| 配列の結合(モダン) |
[...$a, ...$b] |
PHP 7.4〜・柔軟な記法 |
| デフォルト値補完 |
$a + $b |
キー保持・左側の値を優先 |
| 連想配列に追加 |
$arr['key'] = 値 |
既存キーは上書きされる |
迷ったときの選び方:
・1つの要素を末尾に追加 → $arr[] = 値
・複数要素をまとめて末尾に → array_push()
・先頭に追加 → array_unshift()
・途中に挿入 → array_splice()
・配列同士の結合 → array_merge() または [...$a, ...$b]
・デフォルト値の補完 → $custom + $defaults
配列の操作はPHP開発の基本中の基本です。それぞれの方法の違い(特にキーの扱い)を正しく理解しておけば、バグの少ない堅牢なコードが書けるようになります。
この記事で紹介した方法をぜひ実際のプロジェクトで活用してください。