Help us understand the problem. What is going on with this article?

PHPで配列から特定の要素を削除する

More than 3 years have passed since last update.

通常の配列

Indexを指定して削除 : その1

array_splice();

  • 配列を切り取る機能を利用して対象から値を削除する
  • 1つだけの値の削除や連続する値の削除に向いている

切り取られた値 = array_splice(削除対象配列, 切り取り開始Index, 切り取り数);

array_splice使用例
$target = array('a', 'b', 'c');

//削除実行
$split = array_splice($target, 1, 1);

//削除結果
var_dump($target);/*array(2) { [0]=> string(1) "a" [1]=> string(1) "c" }*/

//引数で渡した値も変更されている
var_dump($split);/*array(1) { [0]=> string(1) "b" }*/
array_splice使用例2(連続した値の削除)
$target = array('a', 'b', 'c', 'd');

//削除実行
$split = array_splice($target, 1, 2);//連続した2つの値の削除

//削除結果
var_dump($target);/*array(2) { [0]=> string(1) "a" [1]=> string(1) "d" }*/

Indexを指定して削除 : その2

unset();
array_values();

  • 配列を指定して、unsetで削除するやり方
  • 複数の値の削除に向いている
  • unsetで削除するだけでindexが変更されない。array_valuesでindexを詰める
indexを詰めるとは
$target = array('a', 'b', 'c');

//削除実行
unset($target[1]);

//実行結果
//indexの1を削除したため、indexが連番でなくなっている!
var_dump($target);/*array(2) { [0]=> string(1) "a" [2]=> string(1) "c" }*/

//indexを詰める
$target = array_values($target);

//indexの欠番が詰められて連番になった
var_dump($target);/*array(2) { [0]=> string(1) "a" [1]=> string(1) "c" }*/
unset使用例
$target = array('a', 'b', 'c', 'd');

foreach ($target as $key => $val) {
  if(/*削除条件*/){

      //削除実行
      unset($target[$key]);
  }
}

//Indexを詰める
array_values($target);

Indexを指定して削除のまとめ

1つ削除するだけなら、array_splice()が便利。
ただし、複数削除する場合にarray_splice()で削除を行うと、削除とIndexを詰める作業が同時に発生するため処理が重くなる。
unset();でまとめて削除した後に、array_valuesでIndexをすべて詰める方が処理が早くなる。

要素指定して配列を削除

array_diff();
array_values();

  • index値ではなく、要素そのものを指定して値の削除を行う
  • 削除後に、indexを詰める作業が必要

array_diffは第1引数の配列と第2引数以降の配列と比較し、 第1引数の要素の中で他の配列には存在しないものだけを返す。

array_diff使用例
$target = array('a', 'b', 'c', 'd', 'e');

//削除実行
$result = array_diff($target, array('c', 'e'));
//indexを詰める
$result = array_values($result);

//削除結果
var_dump($result);/*array(3) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "d" }*/

連想配列

unset();

  • keyを用いて連想配列から削除する
unset使用例
$target = array('key1' => 'a', 'key2' => 'b', 'key3' => 'c');

//削除実行
unset($target['key2']);

//削除結果
var_dump($target);/*array(2) { ["key1"]=> string(1) "a" ["key3"]=> string(1) "c" }*/
Quantum
Web系のエンジニア。知見を共有します。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした