PHPで配列から要素を削除して、foreach ($array)
にその要素が含まれなくなるようにする簡単な方法はありますか?
null`に設定すればよいと思ったのですが、どうやらうまくいかないようです。
配列の要素を削除するにはさまざまな方法がありますが、特定の作業に便利なものとそうでないものがあります。
配列の要素を1つだけ削除したい場合は、unset()
またはarray_splice()
を使用します。
また、値があっても要素を削除するためのキーがわからない場合は、array_search()
を使ってキーを取得することができます。
unset()
メソッド注意点としては、`unset()
を使用しても、配列のキーは変更されず、インデックスも変更されません。
コード
<?php
$array = [0 => "a", 1 => "b", 2 => "c"];
\unset($array[1]);
//↑ Key which you want to delete
?>
出力
[
[0] => a
[2] => c
]
array_splice()
メソッドArray_splice()を使用すると、キーのインデックスが自動的に変更されますが、すべてのキーが数値キーに変換されるarray_values()
とは異なり、連想キーは変更されません。
また、array_splice()
の第2パラメータには、キーではなくオフセットが必要です。
コード
<?php
$array = [0 => "a", 1 => "b", 2 => "c"];
\array_splice($array, 1, 1);
//↑ Offset which you want to delete
?>
出力
[
[0] => a
[1] => c
]
array_splice()や\unset()は配列を参照しているので、これらの関数の戻り値を配列に戻すことはありません。
配列の複数の要素を削除したいが、[unset()]や[array_splice()
]を何度も呼びたくない場合は、削除したい要素の値とキーのどちらを知っているかに応じて、[array_diff()]や[array_diff_key()
]という関数を使用することができます。
array_diff()
メソッド削除したい配列の要素の値がわかっている場合は、###[array_diff()
]メソッドを使用できます。先ほどの unset()
と同様に、配列のキーの変更やインデックスの変更は行いません。
コード
<?php
$array = [0 => "a", 1 => "b", 2 => "c"];
$array = \array_diff($array, ["a", "c"]);
//└────────┘→ Array values which you want to delete
?>
出力
[
[1] => b
]
array_diff_key()
メソッド削除したい要素のキーがわかっている場合は、`array_diff_key()
を使用したいと思います。ここでは、キーを値としてではなく、2番目のパラメータのキーとして渡すことを確認する必要があります。そうしないと、array_flip()
で配列を反転させる必要があります。また、ここではキーは変更されず、インデックスも変更されません。
コード
<?php
$array = [0 => "a", 1 => "b", 2 => "c"];
$array = \array_diff_key($array, [0 => "xy", "2" => "xy"]);
//↑ ↑ Array keys which you want to delete
?>
出力
[
[1] => b
]
また、unset()`や
array_splice()を使って同じ値を持つ複数の要素を削除したい場合は、[``array_keys()
]10を使って特定の値に対応するすべてのキーを取得し、すべての要素を削除することができます。
これは、文字列インデックス(ハッシュテーブルとしての配列)を使用する場合には期待できることですが、整数インデックスの配列を扱う場合には非常に驚くべきことになります。
$array = array(0, 1, 2, 3);
unset($array[2]);
var_dump($array);
/* array(3) {
[0]=>
int(0)
[1]=>
int(1)
[3]=>
int(3)
} */
$array = array(0, 1, 2, 3);
array_splice($array, 2, 1);
var_dump($array);
/* array(3) {
[0]=>
int(0)
[1]=>
int(1)
[2]=>
int(3)
} */
そのため、整数のキーを正規化したい場合は、array_splice()
を使用することができます。また、unset()`の後に[array_values()
][3]を使う方法もあります。
$array = array(0, 1, 2, 3);
unset($array[2]);
$array = array_values($array);
var_dump($array);
/* array(3) {
[0]=>
int(0)
[1]=>
int(1)
[2]=>
int(3)
} */