Menu

PHPで配列の要素を削除:unset、array_splice

unset($array[$key])はキーで要素を削除し、array_spliceは位置で削除して番号を振り直し、array_diffは値で削除します。それぞれの使い方、削除後の番号の振り直し、間違った要素を消してしまうarray_searchの落とし穴を学びます。

このページのコードはエディタで実行できます - 編集してすぐに結果を確認できます。

PHPの配列からキーで要素を削除するには、unset($array[$key])を使います。要素はなくなり、ほかのキーはそのまま残り、存在しないキーをunsetしてもエラーにはなりません。

2つ目の結果を見てください。キーは0, 2, 3になっています。unsetは番号を振り直しません。

unsetのあと配列の番号を振り直す

キーに欠番があるリストは、あとで問題を起こします。for ($i = 0; ...)のループは欠けた添字にぶつかり、json_encodeは配列ではなくJSONオブジェクトを書き出します。array_values()できれいなキーに戻せます。

array_spliceで位置を指定して削除する

array_splice($array, $offset, $length)は、位置$offsetから$length個の要素を削除してキーを振り直し、削除したものを返します。負のオフセットは末尾から数えます。同じ呼び出しで置き換えの要素を挿入することもできます。

array_spliceはキーではなく位置で動きます。連想配列では順番の中の位置で削除し、文字列キーは保ちます。元の配列を変えずに一部をコピーするarray_sliceとの比較は、array_sliceのページにあります。

値を指定して要素を削除する

array_diff($array, [$value])は、$valueと等しい要素をすべて除いた配列を、残りのキーを保ったまま返します。最初に一致したものだけを削除するには、array_searchでキーを探してunsetします。

array_diffは値を文字列として比較するので、array_diff([1, "1", 2], [1])は整数と文字列の両方を削除します。条件が「この値と等しい」より複雑なら、コールバック付きのarray_filterを使います。

最初や最後の要素を削除する

array_shift()は最初の要素を、array_pop()は最後の要素を削除します。どちらも削除した要素を返すので、キューやスタックに便利です。

array_shiftは数値キーを0から振り直します。array_popは欠番が末尾にできるだけなので、振り直す必要がありません。

複数のキーを一度に削除する

unsetは1回の呼び出しで複数の要素を受け付けます。配列で持っているキーのリストを削除するには、array_flip()で反転して名前をキーにし、array_diff_key()に渡します。

よくあるミス:値がないときのarray_searchとunset

array_searchは何も見つからないとfalseを返し、配列のキーとして使われたfalseは0になります。そのため次の行は、値が配列にないとき、最初の要素を削除してしまいます。

array_searchの結果は必ず変数に入れ、キーとして使う前に!== falseで比較しましょう。単なるif ($key)でも不十分です。添字0での一致もfalseと評価されるからです。

よくある質問

PHPで値を指定して配列から要素を削除するには?

一致するものをすべて削除するならarray_diff($arr, ['value'])を使います。最初の1つだけを削除するなら、キーを探し、見つかったことを確認してからunsetします:$k = array_search('value', $arr); if ($k !== false) { unset($arr[$k]); }。

unsetのあと配列の番号を振り直すには?

array_values()で包みます:$arr = array_values($arr);でキーが0から振り直されます。あるいは、番号を振り直してくれるarray_splice($arr, $index, 1)で要素を削除します。

配列の最初や最後の要素を削除するには?

array_shift($arr)は最初の要素を削除して返し、数値キーを振り直します。array_pop($arr)は最後の要素を削除して返します。

foreachループの中で要素をunsetできますか?

できます。foreachは元の配列を変更している間も配列のコピーをループするので、foreach ($arr as $k => $v) { if ($v < 0) { unset($arr[$k]); } }は安全です。キーには欠番が残るので、リストが必要ならあとでarray_values()を呼びます。

存在しないキーをunsetするとエラーになりますか?

なりません。unset($arr['missing'])は何もせず、警告も出さないので、先にissetで確認する必要はありません。

Coddyのプログラミング言語のイラスト

Coddyでコードを学ぼう

始める