配列から特定の値を持つ要素を検索して削除する

配列から特定の値を持つ要素を検索して削除する場合、複数の方法が考えられる。下記は、foreach を使って配列の値を確認していく一番シンプルな方法の例。


$array = [
  ['id' => 1000, 'name' => "aaa"],
  ['id' => 1001, 'name' => "bbb"],
  ['id' => 1002, 'name' => "ccc"],
];

$del_id = 1001;

foreach ($array as $i => $v)
{
  if ($array[$i]["id"] == $del_id)
    unset($array[$i]);
}

var_dump($array);
/* var_dump 出力
array(2) {
  [0]=>
  array(2) {
    ["id"]=>
    int(1000)
    ["name"]=>
    string(3) "aaa"
  }
  [2]=>
  array(2) {
    ["id"]=>
    int(1002)
    ["name"]=>
    string(3) "ccc"
  }
}
*/

また、別の方法として array_search() を使う方法がある。array_search() は、指定した値を配列内から探し、最初に見つかった要素のキーを返す関数である。

ただし、サンプルコードのような多次元配列に対して array_search() を使う場合、1つ工夫が必要で array_column() を使って検索対象にしたいデータを抜き出す必要がある。


// array_search()の例

$array = [
  ['id' => 1000, 'name' => "aaa"],
  ['id' => 1001, 'name' => "bbb"],
  ['id' => 1002, 'name' => "ccc"],
];

$del_id = 1001;

var_dump(array_column($array, "id"));
/*
array_columnを使うと、多次元配列から"id"キーに対応するデータを抜き出すことができる
array(3) {
  [0]=>
  int(1000)
  [1]=>
  int(1001)
  [2]=>
  int(1002)
}
*/

// "id"キーに対応する要素の値が$del_idを持つものを検索
$i = array_search($del_id, array_column($array, "id"));

if ($i)
  unset($array[$i]);

var_dump($array);
/*
array(2) {
  [0]=>
  array(2) {
    ["id"]=>
    int(1000)
    ["name"]=>
    string(3) "aaa"
  }
  [2]=>
  array(2) {
    ["id"]=>
    int(1002)
    ["name"]=>
    string(3) "ccc"
  }
}
*/

さらに別の方法として、array_keys() を使う方法がある。array_keys() は、2番目の引数を指定するとその指定した値を持つ要素のキーのみを返してくれる。array_keys() の返り値は、配列であることに注意。

また、array_search() のときと同様に、多次元配列に対しては、array_column() を使って検索対象にしたいデータを抜き出す必要がある。


// array_keys()の例

$array = [
  ['id' => 1000, 'name' => "aaa"],
  ['id' => 1001, 'name' => "bbb"],
  ['id' => 1002, 'name' => "ccc"],
];

$del_id = 1001;

$keys = array_keys(array_column($array, "id"), $del_id);
foreach ($keys as $i)
{
  unset($array[$i]);
}

var_dump($array);
/*
array(2) {
  [0]=>
  array(2) {
    ["id"]=>
    int(1000)
    ["name"]=>
    string(3) "aaa"
  }
  [2]=>
  array(2) {
    ["id"]=>
    int(1002)
    ["name"]=>
    string(3) "ccc"
  }
}
*/