PHPで配列に要素を追加する方法|末尾・先頭・途中の追加まとめ

基本文法・構文ガイド
  • カテゴリ: 配列操作(PHP標準関数)
  • 対象バージョン: PHP 7.4 〜 8.4(配列アンパック構文 [...$a, ...$b] はPHP 7.4以降)
  • 主な関数/構文: $arr[] = 値 / array_push() / array_unshift() / array_splice() / array_merge()
  • 関連: in_array / 連想配列の基礎 / Laravel Collection::push
  • 変更履歴: 各関数の基本仕様は長期的に安定。PHP 7.4で配列アンパック ... によるマージ記法が追加された程度

要点(TL;DR)

  • 末尾に1件だけ追加するなら $arr[] = 値; が最もシンプルで高速。複数件をまとめて追加したいときは array_push($arr, $v1, $v2)
  • 先頭に追加するには array_unshift($arr, 値)、途中の位置に挿入するには array_splice($arr, 位置, 0, 値)
  • 連想配列にキーを追加するには $arr['key'] = 値; と書くだけ(同じキーが既にあれば上書き=更新になる点に注意)
  • 配列同士を結合するなら array_merge()(数値キーは振り直し・文字列キーは後勝ち)か + 演算子(キーは前の配列が優先)
  • 罠: array_push()は関数呼び出しの分だけ$arr[]よりわずかに遅い/array_unshift()は数値キーを振り直すため大きな配列で多用すると重い

概要

PHPで配列に要素を追加する方法は1つではなく、「どこに」「何件」追加したいかによって適切な書き方が変わります。末尾に1件追加するだけなら$arr[] = 値;で十分ですが、先頭への追加や途中への挿入、連想配列へのキー追加、配列同士の結合ではそれぞれ専用の関数・構文を使います。この記事では、目的別に使い分けを整理したうえで、実際に動かせるコード例と、つまずきやすいポイントをまとめて解説します。

目的別の使い分け早見表

やりたいこと使う方法
末尾に1件追加$arr[] = 値;$fruits[] = 'grape';
末尾に複数件まとめて追加array_push()array_push($fruits, 'grape', 'kiwi');
先頭に追加array_unshift()array_unshift($fruits, 'apple');
途中の位置に挿入array_splice()array_splice($fruits, 1, 0, 'grape');
連想配列にキーを追加$arr['key'] = 値;$user['age'] = 20;
配列同士を結合array_merge() / [...$a, ...$b]array_merge($a, $b);

使用例

末尾に要素を追加する($arr[]array_push()

<?php

$fruits = ['apple', 'banana'];

// 1件だけ追加するなら [] が簡潔で高速
$fruits[] = 'cherry';

// 複数件をまとめて追加したいときは array_push
array_push($fruits, 'grape', 'kiwi');

print_r($fruits);
// 出力: Array ( [0] => apple [1] => banana [2] => cherry [3] => grape [4] => kiwi )

array_push()は内部的に$arr[] = 値を繰り返すのとほぼ同じ処理をしますが、関数呼び出しのオーバーヘッドが加わる分だけ$arr[]よりわずかに遅くなります。1件だけ追加する場合は$arr[]を使うのが定石です。

先頭に要素を追加する(array_unshift()

<?php

$fruits = ['banana', 'cherry'];

array_unshift($fruits, 'apple');

print_r($fruits);
// 出力: Array ( [0] => apple [1] => banana [2] => cherry )

array_unshift()は配列の先頭に要素を挿入し、既存の数値キーをすべて0から振り直します。要素数が多い配列に対して繰り返し呼ぶと、キーの振り直しコストが積み重なって処理が遅くなる点に注意してください。

途中の位置に要素を挿入する(array_splice()

<?php

$fruits = ['apple', 'banana', 'grape'];

// インデックス1('banana'の直前)に 'cherry' を挿入
array_splice($fruits, 1, 0, ['cherry']);

print_r($fruits);
// 出力: Array ( [0] => apple [1] => cherry [2] => banana [3] => grape )

array_splice($arr, $offset, $length, $replacement)の第3引数に0を指定すると「削除せずに挿入だけ行う」動作になります。第3引数を省略せず0にすることが、挿入のみを行うポイントです。array_splice()は元の配列を直接書き換える破壊的な関数なので、元の配列を残したい場合は事前に配列をコピーしておきます。

連想配列にキーと値を追加する

<?php

$user = ['name' => 'Taro', 'email' => 'taro@example.com'];

// 新しいキーを追加
$user['age'] = 20;

print_r($user);
// 出力: Array ( [name] => Taro [email] => taro@example.com 日付未入力 => 20 )

連想配列では$arr['key'] = 値;が「追加」と「更新」を兼ねます。指定したキーが存在しなければ新規追加、既に存在すればその値を上書きします。意図せず既存データを上書きしないよう、追加前にarray_key_exists()でキーの有無を確認すると安全です。

配列同士を結合する(array_merge()+ 演算子の違い)

<?php

$a = ['id' => 1, 'name' => 'Taro'];
$b = ['name' => 'Jiro', 'age' => 20];

// array_merge: 同じキーは後ろの配列($b)が優先
$merged = array_merge($a, $b);
print_r($merged);
// 出力: Array ( [id] => 1 [name] => Jiro 日付未入力 => 20 )

// + 演算子: 同じキーは前の配列($a)が優先
$added = $a + $b;
print_r($added);
// 出力: Array ( [id] => 1 [name] => Taro 日付未入力 => 20 )

array_merge()は数値キーを振り直し、文字列キーが重複している場合は後ろの配列の値で上書きします。一方+演算子はキーを振り直さず、重複キーは前の配列の値を優先します。数値配列を末尾に連結したいときはarray_merge()、連想配列で既存のキーを守りたいときは+演算子、と覚えておくと選びやすくなります。

多次元配列に要素を追加する

<?php

$users = [
    ['id' => 1, 'name' => 'Taro'],
    ['id' => 2, 'name' => 'Hanako'],
];

// 配列(1レコード)を末尾に追加
$users[] = ['id' => 3, 'name' => 'Jiro'];

// 既存の要素(連想配列)に新しいキーを追加
$users[0]['email'] = 'taro@example.com';

print_r($users[0]);
// 出力: Array ( [id] => 1 [name] => Taro [email] => taro@example.com )

多次元配列でも考え方は同じです。配列全体(1レコード)を追加するなら$users[] = [...];、既存の要素の中にキーを追加するなら該当インデックスを指定してから['新しいキー'] = 値と書きます。

重複を避けて追加する

<?php

$tags = ['php', 'laravel'];
$new_tag = 'php';

if (!in_array($new_tag, $tags, true)) {
    $tags[] = $new_tag;
}

print_r($tags);
// 出力: Array ( [0] => php [1] => laravel )(重複しないため追加されない)

単純に追加するだけでは同じ値が重複して入ってしまいます。追加前にin_array()で存在確認するか、追加後にまとめてarray_unique()で重複を除去する方法もあります。詳しい判定の使い分けはin_arrayの使い方を参照してください。

よくある落とし穴・注意

  • array_pushは1件追加だと$arr[]よりわずかに遅い:関数呼び出しのオーバーヘッドが発生するため、1件だけの追加なら$arr[] = 値;を優先します。array_pushは複数件をまとめて追加する場合に向いています。
  • array_unshiftは数値キーを振り直す:既存の数値キーに依存したコード(キーをIDとして使っている場合など)では、先頭に追加した瞬間にキーがずれるため注意が必要です。
  • array_mergeと+演算子はキーの優先順位が逆:array_mergeは後ろの配列が勝ち、+演算子は前の配列が勝ちます。取り違えると意図しない値で上書きされます。
  • 連想配列への代入は「追加」と「更新」を兼ねる:既存キーに$arr['key'] = 値;を実行すると値が上書きされます。誤って上書きしないよう、必要ならarray_key_exists()で事前に確認します。
  • array_spliceは破壊的:元の配列を直接書き換えます。元のデータを残したい場合は、事前に配列をコピーしてからarray_splice()を実行してください。

代替・関連APIとの比較

方法追加位置戻り値特徴
$arr[] = 値;末尾なし最もシンプルで高速。1件ずつの追加に向く
array_push($arr, ...値)末尾int(追加後の要素数)複数要素をまとめて追加できるが関数呼び出しの分だけ遅い
array_unshift($arr, ...値)先頭int(追加後の要素数)数値キーを振り直すためコストが高い
array_splice($arr, $offset, 0, 値)任意の位置array(削除された要素、通常は空)挿入だけでなく削除・置換もできる。破壊的
array_merge($a, $b)結合(末尾側)array数値キーは振り直し、文字列キーは後勝ち
$a + $b結合arrayキーは振り直さず、重複キーは前の配列が優先
Laravel Collection::push / add末尾などCollectionLaravelでコレクションを扱っている場合はメソッドチェーンで簡潔に書ける

トラブルシュート(症状別)

症状原因対処
追加したはずなのに配列の件数が変わらない戻り値を新しい変数に代入し、元の$arrを更新していないarray_push()array_splice()は第一引数を参照渡しで直接書き換える関数。戻り値ではなく元の変数をそのまま確認する
連想配列にキーを追加したら既存データが消えた同じキー名で上書きしてしまった追加前にarray_key_exists()でキーの有無を確認するか、キー名を見直す
array_mergeで数値キーが0から振り直されて困るarray_mergeの仕様上、数値キーは常に振り直される数値キーを保持したまま結合したい場合は+演算子を使う
array_unshiftを繰り返し呼ぶと処理が遅い呼び出しのたびに数値キーの振り直しが発生している追加する要素を配列にまとめてから1回のarray_unshift()で追加する

よくある質問(FAQ)

Q. array_push($arr, $val) と $arr[] = $val はどちらを使うべきですか?

A. 1件だけ追加するなら$arr[] = $val;のほうが高速でシンプルです。複数の要素をまとめて追加したい場合や、「複数追加している」という意図をコードで明示したい場合はarray_push($arr, $val1, $val2)を使います。

Q. 配列の先頭に要素を追加する方法は?

A. array_unshift($arr, $val)を使います。ただし数値キーが0から振り直されるため、大きな配列に対して頻繁に呼ぶと処理が重くなる点に注意してください。

Q. 連想配列でキーが既に存在するかを確認してから追加したい場合は?

A. array_key_exists('key', $arr)で事前に確認できます。isset($arr['key'])でも近い判定ができますが、値がnullの場合にisset()falseを返すため、両者の挙動の違いに注意してください。

Q. Laravelのプロジェクトでもこの記事の方法をそのまま使えますか?

A. 素のPHP配列であればそのまま使えます。取得結果がすでにLaravelのCollectionの場合は、pushaddなどのCollectionメソッドを使うほうがメソッドチェーンで簡潔に書けます。

関連記事

参考リンク

レン (Wren)

こんにちは。レンです。

Laravelのコードの森に住んでいる、小さな案内役です。
ルーティングの枝やクラスの影を歩きながら、コードの流れや仕組みを眺めています。

このサイトでは、Laravelの基本から実装のコツまで、開発で役立つポイントを静かに整理しています。
難しいことを増やすのではなく、コードの見通しが少し良くなるヒントを届けるのが役目です。

「この処理はどこに書くのがいいのか」
「Laravelではどう考えると整理できるのか」

そんな疑問に、小さなメモを残すような気持ちで記事を書いています。

コードを書いている途中で迷ったとき、
このサイトが少し立ち止まって整理できる場所になればうれしいです。

レン (Wren)をフォローする

コメント