「PHPで変数や配列の要素を削除したいけど、正しい方法がわからない」そんな悩みを抱えていませんか?
本記事では、PHPのunset関数の使い方から注意点、配列の削除やメモリ解放の応用まで、経験者はもちろん初心者にもわかりやすく丁寧に解説します。実務ですぐ使えるテクニックを豊富なコード例とともに紹介します。ぜひご覧ください。
目次
1.PHPのunset関数とは?用途と基本的な使い方
PHPで変数や配列の要素を削除するには、unsetという関数を使います。プログラムの中で不要になったデータを明示的に消すことで、意図しない参照やエラーを防ぎ、メモリ使用量の最適化につなげることが可能です。ここでは、unsetの基本的な仕組みと、よく使われる場面を解説します。
PHPで変数・配列を削除するには?
PHPでコードを書いていると、一度代入した変数や配列の要素を途中で消す処理が必要になることがあるでしょう。たとえば、フォームから受け取った一時的なデータを処理後に消したい場面や、配列の中から特定の値だけを削除したい場面などが出てきます。
このような場面で使えるのが、unset関数です。unsetを使うと指定した変数や配列の要素をメモリ上から削除できます。削除された変数は未定義状態となり、unset以降に参照しようとすると「未定義変数」の扱いになります。
PHPにおけるunset関数の基本構文と使用例
unsetの基本構文は次の通りです。
unset($変数名); |
たとえば、次のコード例のように使います。
$sample = "Hello, PHP!"; echo "◆before \n"; echo $sample;
echo "\n"; echo "◆after \n"; echo $sample; |
実行結果は次のようになります。
◆before Hello, PHP! ◆after
|
unsetを使う前に$sampleにセットされていた内容は、unsetで削除され「未定義変数」になっているのがわかるでしょう。
また、配列の要素を削除する場合は、次のコード例のようにキーを指定して使います。
$array = ["apple", "banana", "orange"]; echo "◆before \n"; print_r($array);
echo "\n"; echo "◆after \n"; print_r($array); |
実行結果は次のようになります。
◆before Array ( [0] => apple [1] => banana [2] => orange )
Array ( [0] => apple [2] => orange ) |
なお、unsetで削除後の配列はインデックスが連続しなくなる点に注意してください。
PHPにおけるunsetとissetとの違い
unsetとよく一緒に使われるのがissetです。この2つは見た目は似ていますが、役割はまったく違います。unsetが変数や配列の中身を削除する関数であるのに対して、issetはその変数や配列の要素が存在しているかを確認する関数です。
$value = "sample";
echo isset($value);
echo "\n"; echo "◆after \n"; echo isset($value); |
最初は$valueに文字列が入っているので、issetは「1:true」を返します。しかし、unsetでその変数を削除すると、もう存在しなくなるため、issetは「出力なし:false」になります。
◆before 1 ◆after |
unsetはissetを組み合わせて使うとより安全になります。削除しようとしている配列のキーが本当に存在しているか確認するために、issetを使ってからunsetすることで、意図しない誤作動を防ぐことができるでしょう。
コード例
$array = [ "name" => "Tanaka", "age" => 28 ];
unset($array["age"]); } |
このコード例のようにしておけば、存在しないキーを削除しようとしても、不要な処理を避けることができます。
存在しないキーに対してunsetを使ってもPHPはエラーを出しませんが、issetで事前にチェックしておくことで、コードの意図がより明確になり、他人が読んでもわかりやすいコードになるでしょう。
2.PHPでunsetを使って配列を削除する方法
配列は複数の値をまとめて扱える便利なデータ構造です。処理の途中で一部の要素を削除する場面があります。そんなときに、PHPではunsetを使うと配列の中から特定の要素やキーを柔軟に削除できます。
ここでは、PHPで使う数値インデックス配列と連想配列それぞれにおいて、unsetを使った配列の削除方法や注意点について解説します。
PHPのunsetで配列の特定要素を削除する
PHPにおいて、いわゆる通常の配列である数値インデックス配列では、配列内の特定の要素を削除したい場合、削除したい要素のインデックス番号をunsetに指定してください。
$fruits = ["apple", "banana", "orange"]; unset($fruits[1]); print_r($fruits); |
実行結果
Array ( [0] => apple [2] => orange ) |
要素としてbananaは削除されますが、配列のインデックスは再構成されません。つまりこのコード例の場合では、[1]が空いたままとなります。ループや表示時に予期しない動作をするおそれがあるので注意してください。
インデックスを振り直したい場合は、array_values()関数で再構成しましょう。
$fruits = array_values($fruits); print_r($fruits); |
この処理で配列が再構成されインデックスが連番に戻ります。
実行結果
Array ( [0] => apple [1] => orange ) |
PHPのunsetで連想配列からキーを削除する
連想配列では、削除したいキー名を指定してunsetを使ってください。
$user = [ "name" => "Yuki", "age" => 30, "email" => "yuki@example.com" ];
print_r($user); |
このコード例では、「email」というキーとその値が削除され、「name」と 「age」が配列に残ります。
Array ( [name] => Yuki [age] => 30 ) |
なお連想配列の場合、インデックスの順番が意味を持たないため再構成は不要です。issetと組み合わせて、安全に削除を行うことも可能です。
if (isset($user["email"])) { unset($user["email"]); } |
前述しましたが、PHPでは存在しないキーを指定してもエラーにはなりません。しかし、コードの意図を明確にしたり読みやすさを保つために、存在確認を挟むことをおすすめします。
foreachでunsetを使うときの注意点と対策
配列の各要素に順番にアクセスするために便利なforeachですが、foreachの中でunsetを使うと、思わぬ挙動を起こす恐れがあります。
注意したいのは、参照渡しでループしている場合です。
$items = ["item A", "item B", "item C"]; foreach ($items as &$item) { unset($item); } print_r($items); |
このコードのように書くと、最後の要素が削除されたように見えて、実は次回以降のループや代入に影響が残ります。なぜなら、$itemが参照として配列の一部と結びついたままになっているためです。
実行結果
Array ( [0] => item A [1] => item B [2] => item C ) |
回避するためには、unsetのあとに変数の参照を切りましょう。安全に処理するには、unset($item)のあとでループの外でもう一度unset($item)を書いて、参照を解除する必要があります。
$items = ["item A", "item B", "item C"];
if ($item === 2) { unset($items[array_search($item, $items)]); } } unset($item); |
または、参照渡しを使わず、値渡しでループする方法もあります。
$items = ["item A", "item B", "item C"];
if ($item === 2) { unset($items[$key]); } } |
oreachとunsetを組み合わせるときは、ぜひ参考にしてください。
関連記事
PHP配列完全ガイド|初期化・追加・要素数・操作から配列操作・連想配列まで徹底解説
3.PHPでunsetを活用する実践方法
unsetは単に変数を削除するだけでなく、複数のデータを一括で削除したり、セッションやPOSTデータの整理に活用したり、メモリ使用量の削減ができたり、実用的に活用できる場面が多くあります。ここでは、PHPでunsetを活用する実践方法を紹介します。
PHPのunsetで複数の変数や要素を一括で削除する
unsetは、カンマ区切りで複数の変数や配列の要素を同時に指定することが可能です。個別に何度もunsetを書く必要はありません。
$a = 1; $b = 2; $c = 3;
echo $a, $b, $c;
echo "◆after \n"; echo $a, $b, $c; |
このように書くことで、3つの変数をまとめて削除できます。
実行結果
◆before 123 ◆after
Warning: Undefined variable $b~ Warning: Undefined variable $c~ |
もちろん配列の要素でも同様に指定可能です。
$data = ["id" => 1, "name" => "Sato", "email" => "sato@example.com"];
print_r($data); |
実行結果
Array ( [id] => 1 ) |
一括で複数の削除をする場合も、キーが存在しているかどうかを事前にissetで確認すると良いでしょう。
PHPのunsetで一時的なセッションやPOSTデータを消す
フォーム処理やログイン処理などで使われるセッションやPOSTデータには、使い終わったあとに不要になる情報が含まれます。これらの不要な情報を削除しないまま保持すると、セキュリティ面で良くありません。
このような場面でもunsetが役立ちます。unsetを使って使い終えたセッション変数を明示的に削除しましょう。
session_start();
|
フォーム送信後にPOSTデータを消去する時にも使えます
if ($_SERVER["REQUEST_METHOD"] === "POST") { // 入力処理を実行...
} |
明示的に削除することで、ページ再読み込み時の誤送信や二重登録のリスクを軽減できます。ただし、セッションやリクエスト系のスーパーグローバル変数は扱いに注意が必要なので、仕様をしっかり確認して使ってください。
PHPのunsetでメモリ解放する
unsetを使い不要な変数を明示的に削除すると、メモリ解放ができるので、メモリの節約にも役立ちます。
PHPは通常スクリプトの終了時に自動的にメモリを開放しますが、大量の配列やオブジェクトを扱う処理では、早めに不要な変数を削除しておくことで、メモリ使用量を抑えることが可能です。
特にバッチ処理やファイル読み込みのように繰り返し大量のデータを扱う場合には、不要になったタイミングで変数を明示的にunsetすることで、メモリ不足やパフォーマンス低下を防げます。
ただし、むやみやたらとunsetを使いすぎるとコードの可読性が下がるため、場面を限定して活用しましょう。たとえば「長時間スクリプトが走る処理」「大規模な配列・オブジェクトを使う処理」などに活用すると効果的です。
関連記事
phpの三項演算子とは?issetや省略、echoと複数条件の使い方と実例を解説
4.PHPのunsetが効かない原因と対処法
unsetは非常にシンプルな関数ですが、実際に使ってみると、削除されないとか、思った通りに動かないなどの場面に遭遇することがあります。こうした場面の多くは、スコープや参照、存在しないキーの扱いに原因があります。ここでは、unsetが効かない理由と、それを解決するための対処法を整理して解説します。
PHPでunsetを存在しないキーに対して使うとどうなるか?
PHPでunsetを使って存在しないキーを指定した場合でもエラーは発生しません。処理自体は無視されるため、初心者などは本当に削除されたのかな?と不安になることがあります。
$data = ["id" => 1, "name" => "Suzuki"]; unset($data["email"]); |
このコードを実行しても、警告やエラーメッセージは表示されません。 $data["email"] が存在していないため、単に無視されるだけです。
明確な意図を持って削除したい場合は、issetで存在を確認してからunsetを実行しましょう
if (isset($data["email"])) { unset($data["email"]); } |
このコード例のようにしておくと、コードの意図や目的が明確になり、将来メンテナンスする際にも、このキーは存在している前提で処理していると判断しやすくなるはずです。
スコープの問題と関数内でのunsetの注意点
unset()を関数内で使用する場合、スコープの違いによって思ったように変数が削除されないことがあります。PHPでは、関数の中で操作した変数は、基本的にローカルスコープ(その関数の中だけ)に限定されます。
$value = "test";
unset($value); // グローバル変数には影響しない }
echo $value; // 出力される |
上記のように、関数内でunset()しても、外の$valueには影響しません。
対処法:グローバル変数を扱う場合はglobal宣言を
どうしても関数内で外部の変数を削除したいときは、globalを使って対象の変数を関数内で明示的に宣言します。
$value = "test";
global $value; unset($value); }
echo $value; // Warning: Undefined variable |
ただし、グローバル変数の多用はバグの原因にもなるため、使用は最小限にとどめた方が良いでしょう。
参照渡しの解除とunsetの落とし穴
PHPでは、変数を参照(&)で渡すと、元の変数と中身が共有されます。この仕組みを正しく理解していないと、unset()が効かないように見える場面が出てきます。
$a = "apple"; $b =& $a;
echo $a; // 出力: apple |
このコードでは、$bを削除しても、$aの中身は残ったままです。なぜなら、unset($b)は変数名$bのリンクを切るだけで、値そのものには影響しないからです。
対処法:参照元を明示的に削除する
値そのものを消したい場合は、参照先の変数を直接削除する必要があります。
unset($a); // これで実際に値が消える |
また、foreachで参照を使った後も、ループの外でunset($変数)を行って、参照を断ち切ることが推奨されます。
foreach ($array as &$item) { // 処理 } unset($item); // 忘れるとバグの元 |
参照は便利な一方で、意図しない副作用を招く可能性があるため、使い終えたら確実に解除することが大切です。
5.PHPで使える他の配列操作関数との違い
PHPには配列の中身を削除・変更するための関数が複数用意されています。unsetだけでなく、array_splice、array_shift、array_popなどの関数もよく使われます。これらの関数は似たように見えて、それぞれ特徴や用途が異なります。ここでは、それぞれの関数の違いを比較しながら、どの場面でどの関数を使うべきかを整理して解説します。
PHPにおけるunsetと配列構造に影響を与える関数との違い
まず最初に、unsetと他の削除系関数の挙動の違いを押さえておきましょう。
unsetの特徴
unsetは指定した要素を削除しますが、インデックス番号を詰め直すことはしないので、インデックスが連続していない状態になります。
コード例
$array = ["A", "B", "C"]; unset($array[1]); print_r($array); |
実行結果
Array ( [0] => A [2] => C ) |
array_spliceの特徴
array_spliceは配列の一部を削除し、インデックスを自動で詰め直してくれます。
コード例
$array = ["A", "B", "C"]; array_splice($array, 1, 1); print_r($array); |
実行結果
Array ( [0] => A [1] => C ) |
ループ処理や順序が重要な場面では、unsetよりもarray_spliceの方が扱いやすい場合があります。
array_shiftの特徴
array_shiftは配列の先頭の要素を削除する関数です。削除後は、残った要素が前詰めされ、インデックスも振り直されます。
コード例
$array = ["A", "B", "C"]; array_shift($array); // "A" を削除 print_r($array); |
実行結果
Array ( [0] => B [1] => C ) |
FIFO(First In, First Out)構造の処理に適しており、キューのように先頭からデータを順に取り出す場面で使うと便利です。
array_popの特徴
array_popは配列の末尾の要素を削除する関数です。array_shiftと同様、削除後にインデックスが詰め直されます。
コード例
$array = ["A", "B", "C"]; array_pop($array); // "C" を削除 print_r($array); |
実行結果
Array ( [0] => A [1] => B ) |
LIFO(Last In, First Out)構造の処理に適しており、スタックのように後ろからデータを処理したいときに便利です。
array_valuesの特徴
unset()を使った後で、インデックスを詰め直したい場合はarray_values()を使いましょう。
コード例
$array = ["A", "B", "C"]; unset($array[1]); $array = array_values($array); print_r($array); |
実行結果
Array ( [0] => A [1] => C ) |
array_valuesを使うことで数値インデックスが再割り当てされ、後の処理で扱いやすくなります。
PHPで配列を整理するための関数の使い分け
PHPで配列を整理するために使える関数を、目的別に整理してみました。ぜひ活用してください。
目的:操作したい内容 | おすすめの関数 |
---|---|
特定の要素を削除(順序を問わない) | unset |
特定の要素を削除(順序を維持する) | array_splice |
先頭の要素を削除 | array_shift |
末尾の要素を削除 | array_pop |
複数の要素を一括削除 | array_splice、またはunset |
インデックスを再構成 | array_values |
6.PHPのunsetが非推奨となる使い方とは?
unsetは便利な関数ですが、むやみに多用するとコードの可読性や保守性を損なう原因になりかねません。構造的に設計されたコードや、チームで開発するプロジェクトでは、unsetを使う前に十分に検討が必要です。
ここでは、PHPでunsetが非推奨とされやすい使い方と、その背景にある理由、代替手段や設計上の工夫について解説します。
unsetに頼りすぎるとコードが読みにくくなる理由
unsetを頻繁に使うコードは、処理をしっかり管理しているようにも見えますが、初見でコードを読む人などにとってはわかりにくいことも多く、「この変数はまだ使われるのか?」とか「どこで消えたのか?」といった混乱を生みやすくなります。
非推奨なコード例
$data = getUserData(); processData($data); unset($data); |
このコード例では、$dataが途中で消えているため、後続の処理で再利用できるのかどうかが分かりにくくなっていないでしょうか?
関数やスコープをうまく活用すれば、わざわざunsetで変数を削除しなくても自然に処理が終わります。コードの可読性や再利用性を高めたい場合には、変数の寿命はスコープに任せるのが良いでしょう。
unsetが非推奨なケースとその判断基準
次のような場面では、unsetの代わりに他の方法を検討するほうが適しています。
一時的なデータの処理ではunsetを使わない
一時的な変数を関数内で扱う場合、スコープの終了に任せて変数を自然に破棄するのが理想的です。
コード例
function handleInput() { $input = $_POST["email"]; // 処理だけしてreturn } |
このコード例のように関数の中で閉じた処理にすれば、外部に影響は残りません。
配列の要素を整理する
特定の要素を削除したい場合、unsetで直接消すのではなく、条件に合う要素だけを残して新しい配列を作る方法が安全でわかりやすいです。たとえば、nullの値を除外したい場合は、次のコード例を参考にしてください。
コード例
$data = ["apple", null, "banana", null, "orange"];
return $item !== null; });
|
実行結果
Array ( [0] => apple [2] => banana [4] => orange ) |
array_filterは条件に合った要素だけを抽出して新しい配列を作成し、インデックス番号は元の配列を引き継ぎます。もし連番にしたい場合には、array_valuesを組み合わせれば連番に整えることが可能です。
コード例
$data = ["apple", null, "banana", null, "orange"];
return $item !== null; });
|
実行結果
Array ( [0] => apple [1] => banana [2] => orange ) |
特定の値を除外する
特定の値をまるごと除外したい場合は、array_diffを使うのも有効です。
コード例
$data = ["apple", "banana", "orange", "banana"]; $filtered = array_diff($data, ["banana"]);
|
実行結果
Array ( [0] => apple [2] => orange ) |
unsetを使わないために設計を工夫する
unsetを使わないようにするためには、そもそも削除する必要がないコード設計になるように工夫することが重要です。
明確なスコープの設計
変数が必要な範囲を最小限にとどめ、使い終わったらスコープを抜ける構成にしましょう。
コード例
function renderTemplate() { $template = loadTemplate(); echo $template; } // $templateは関数の外には影響しない |
一貫した変数管理ルールの導入
プロジェクト全体で「再代入を避ける」「一時変数を関数内に閉じ込める」などの変数管理のルールを設けると、unsetに頼らなくても安全なコードになります。
意図をコメントで補足
どうしてもunsetが必要な場合は、削除の理由をコメントで残しておくと、第三者がコードを読むときに親切です。
コード例
unset($token); // メモリ節約のため、処理後に削除 |
関連記事
PHPプログラミングとは?将来性や実践で活用できるコード例など初心者にわかりやすく解説
7.まとめ
本記事ではPHPのunset関数について、変数や配列の削除方法、issetとの組み合わせ、foreach内での注意点、メモリ解放や非推奨な使い方まで幅広く解説しました。unsetはシンプルながらも奥が深く、扱い方次第でコードの安全性やパフォーマンスが大きく変わります。セッション処理やフォーム送信後のデータ削除など、実務で直面する場面に即したテクニックも紹介しました。
PHPを扱うエンジニアやWeb制作者の方が、unsetの使いどころを正しく理解し、適切に実装できるようになることを期待しています。
本記事が皆様にとって少しでもお役に立てますと幸いです。
「フリーランスボード」は、数多くのフリーランスエージェントが掲載するITフリーランスエンジニア・ITフリーランス向けの案件・求人を一括検索できるサイトです。
開発環境、職種、単価、稼働形態、稼働日数など様々な条件から、あなたに最適なフリーランス案件・求人を簡単に見つけることができます。
単価アップを目指す方や、自分の得意なスキルを活かせる案件に参画したい方は、ぜひ「フリーランスボード」をご利用ください。
自身に最適なフリーランスエージェントを探したい方はこちらよりご確認いただけます。