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で確認する必要はありません。