配列要素を削除する方法はいくつかありますが、便利なメソッドがいくつもあります。
1つの配列要素だけを削除したい場合は、unset()または array_splice()メソッドが使用できます。
1つの配列要素を削除する
unset()メソッド
unset()メソッドを使用するとき、配列キーは再インデックスされないことに注意してください。キーの再インデックスをしたい場合は、unset()の後にarray_values()メソッドを使用して、すべてのキーを0から始まる数値の列挙キーに変換する必要があります。
array_values()メソッドを使用しない場合
Code
<?php $array = [0 => "a", 1 => "b", 2 => "c"]; unset($array[1]); //↑ 削除したいキーを指定する。 var_dump($array); ?>
Output
array(2) { [0]=> string(1) "a" [2]=> string(1) "c" }
array_values()メソッドを使用する場合
Code
<?php $array = [0 => "a", 1 => "b", 2 => "c"]; unset($array[1]); $array2 = array_values($array); var_dump($array2);
Output
array(2) { [0]=> string(1) "a" [1]=> string(1) "c" }
array_values()メソッドを使用するとindexが再設定されていることが確認できると思います。
array_splice()メソッドを使用する
array_splice()を使用すると、キーのインデックスは自動的に再作成されますが、連想配列のキーは、すべてのキーを数字キーに変換するarray_values()とは異なり、変更されません。
また、array_splice()は、2番目のパラメータとして、キーではなくオフセットが必要です。
切り取られた値 = array_splice(削除対象配列, 切り取り開始Index, 切り取り数);
Code
<?php $array = [0 => "a", 1 => "b", 2 => "c"]; $array2 = array_splice($array, 1, 1); //↑ Offset which you want to delete var_dump($array);
Output
array(2) { [0]=> string(1) "a" [1]=> string(1) "c" }
array(1) { [0]=> string(1) "b" }
複数の配列要素を削除する
複数の配列要素を削除し、unset()または、array_splice()を複数回呼び出したくない場合は、値またはキーがわかっているかどうかに応じて、関数array_diff()またはarray_diff_key()を使用できます。
array_diff()メソッドを使用する
削除したい配列要素の値がわかっている場合は、array_diff()メソッドを使用できます。以前のようにunset()を使用使用した際のように、配列のキーの変更やインデックスの再作成は行われません。
Code
<?php $array = [0 => "a", 1 => "b", 2 => "c"]; $array = array_diff($array, ["a", "c"]); //└────────┘→ 削除したい配列のvalueを入れる。 var_dump($array); ?>
Output
array(1) { [1]=> string(1) "b" }
unset()メソッドのときのようにindexの値が、再作成されていないことがわかります。
array_diff_key()メソッドを使う
array_diff_key()は、配列のキーの差異を調べる関数です。一方にあって一方にないキーを確認できます。比較は、(string)$a===(string)$bで行われます。例えば、数値の1と文字列の”1″は同じになります。多次元配列の場合、一次元のみが比較されます。
このメソッドを利用し、配列の値が違うときに配列の要素を削除することが出来ます。
Code
<?php $array = [0 => "a", 1 => "b", 2 => "c"]; $array = array_diff_key($array, [0 => "xy", "2" => "xy"]); //↑ ↑ Array keys which you want to delete var_dump($array); ?>
Output
array(1) { [1]=> string(1) "b" }
この場合もunset()メソッドで配列を消したときと同様配列のインデックスの更新は行われません。
まとめ
今回の記事では配列の要素の消し方について紹介しました。
基本的なことですが、結構やる機会はあると思います。
PHPで配列から特定の要素を削除する際の参考になれば幸いです。