PHPで配列の要素を削除する方法について

採用はこちら

PHPで配列の要素を削除するときは、基本的にunset()を使用します。

unset()を使えば、配列のキーを指定して、その要素だけを削除できます。

たとえば、次のような配列があるとします。

$fruits = ['apple', 'banana', 'orange'];

2番目のbananaを削除する場合は、次のように記述します。

unset($fruits[1]);

print_r($fruits);

実行結果は次のようになります。

Array
(
    [0] => apple
    [2] => orange
)

bananaは削除されていますが、キーが02になっている点に注目してください。

unset()で数値インデックスの要素を削除しても、残っている数値キーは自動的には振り直されません。

PHPで配列を削除するときには、この特徴を理解しておくことが重要です。

目次

unset()を使って配列の要素を削除する方法

数値インデックスの配列から削除する

数値インデックスを使用している配列では、削除したい要素のキーを指定します。

$colors = ['red', 'blue', 'green'];

unset($colors[1]);

print_r($colors);

結果は次のとおりです。

Array
(
    [0] => red
    [2] => green
)

キー1に格納されていたblueだけが削除されます。

削除したいキーが分かっている場合は、unset()を利用するのがもっともシンプルな方法です。

連想配列から要素を削除する

unset()は連想配列でも利用できます。

たとえば、次のようなユーザー情報の配列があるとします。

$user = [
    'name' => 'Taro',
    'age' => 30,
    'email' => 'taro@example.com'
];

ageを削除する場合は、次のように記述します。

unset($user['age']);

print_r($user);

実行結果は次のようになります。

Array
(
    [name] => Taro
    [email] => taro@example.com
)

連想配列ではキー名を直接指定できるため、削除する対象が明確であれば非常に分かりやすい方法です。

複数の配列要素を一度に削除する方法

unset()には複数の要素を指定できる

unset()を使うと、複数の配列要素を一度に削除することもできます。

$data = ['A', 'B', 'C', 'D'];

unset($data[1], $data[3]);

print_r($data);

結果は次のようになります。

Array
(
    [0] => A
    [2] => C
)

次のように個別に記述することもできます。

unset($data[1]);
unset($data[3]);

しかし、削除対象があらかじめ分かっているのであれば、

unset($data[1], $data[3]);

とまとめたほうが簡潔に記述できます。

unset()で削除したあとのインデックスを詰める方法

array_values()で数値キーを振り直す

unset()を使用すると、削除した位置の数値キーが抜けた状態になります。

たとえば、次のコードを実行します。

$fruits = ['apple', 'banana', 'orange'];

unset($fruits[1]);

配列は次の状態になります。

0 => apple
2 => orange

数値インデックスを、

0
1

のように連続させたい場合は、array_values()を利用します。

$fruits = array_values($fruits);

print_r($fruits);

実行結果は次のとおりです。

Array
(
    [0] => apple
    [1] => orange
)

そのため、数値配列から要素を削除し、その後も連続したインデックスが必要な場合は、

unset($fruits[1]);

$fruits = array_values($fruits);

という使い方ができます。

array_values()の戻り値を代入する

array_values()は元の配列そのものを直接変更する関数ではありません。

数値キーを振り直した新しい配列を返します。

そのため、

array_values($fruits);

と実行するだけではなく、

$fruits = array_values($fruits);

のように戻り値を代入する必要があります。

値を指定して配列の要素を削除する方法

array_search()とunset()を組み合わせる

unset()は基本的にキーを指定して削除する方法です。

そのため、

banana

のような値を指定して削除したい場合は、まず対応するキーを探します。

その際に利用できるのがarray_search()です。

$fruits = ['apple', 'banana', 'orange'];

$key = array_search('banana', $fruits, true);

if ($key !== false) {
    unset($fruits[$key]);
}

array_search()によってbananaのキーを取得し、そのキーをunset()に渡しています。

結果は次のようになります。

Array
(
    [0] => apple
    [2] => orange
)

array_search()の戻り値は厳密に判定する

array_search()で特に注意したいのが、戻り値の判定です。

値が見つからなかった場合、array_search()falseを返します。

そのため、次のように記述します。

if ($key !== false) {
    unset($fruits[$key]);
}

次の書き方は適切ではありません。

if ($key) {
    unset($fruits[$key]);
}

配列の先頭に目的の値が存在した場合、array_search()はキー0を返す可能性があります。

PHPの条件式では0が偽として評価されるため、要素が見つかっているにもかかわらず削除処理が実行されません。

したがって、

$key !== false

と厳密比較することが重要です。

array_search()の第3引数にtrueを指定する

array_search()では、第3引数にtrueを指定できます。

$key = array_search($target, $array, true);

trueを指定すると、値だけでなく型まで含めて厳密に比較します。

たとえば、

1

という整数と、

'1'

という文字列を区別したい場合に有効です。

意図しない型変換による一致を避けたい場合は、第3引数にtrueを指定する方法が適しています。

同じ値をすべて削除する方法

array_filter()を使って特定の値を除外する

array_search()は、該当する値が複数あっても、見つかったキーを1つ返します。

同じ値をすべて削除したい場合には、array_filter()を利用できます。

$numbers = [1, 2, 3, 2, 4];

$numbers = array_filter(
    $numbers,
    fn($value) => $value !== 2
);

print_r($numbers);

結果は次のようになります。

Array
(
    [0] => 1
    [2] => 3
    [4] => 4
)

値が2ではない要素だけを残しているため、すべての2が除外されています。

array_filter()では残したい条件を書く

array_filter()を理解するうえで重要なのは、削除したい条件ではなく、基本的に「結果に残したい条件」をコールバックで指定することです。

たとえば、

fn($value) => $value !== 2

は、

「値が2ではない要素を残す」

という意味になります。

その結果として、値が2の要素が削除されたような配列を取得できます。

array_filter()でもキーは保持される

array_filter()では、元の配列のキーが保持されます。

先ほどの例では、

0
2
4

という数値キーが残っています。

キーを連続させたい場合は、array_values()を組み合わせます。

$numbers = array_values(
    array_filter(
        $numbers,
        fn($value) => $value !== 2
    )
);

結果は次のようになります。

Array
(
    [0] => 1
    [1] => 3
    [2] => 4
)

条件に一致する配列要素を削除する方法

array_filter()で条件に応じて要素を残す

array_filter()は、特定の値だけでなく、さまざまな条件に基づいて配列を絞り込む場合にも利用できます。

たとえば、10未満の値を除外して10以上だけを残す場合は、次のように記述します。

$numbers = [5, 10, 15, 20];

$numbers = array_filter(
    $numbers,
    fn($value) => $value >= 10
);

print_r($numbers);

結果は次のとおりです。

Array
(
    [1] => 10
    [2] => 15
    [3] => 20
)

5だけが条件に一致しないため、結果から除外されています。

foreachとunset()を組み合わせる

より複雑な条件で配列要素を削除する場合は、foreachunset()を組み合わせる方法もあります。

$numbers = [5, 10, 15, 20];

foreach ($numbers as $key => $value) {
    if ($value < 10) {
        unset($numbers[$key]);
    }
}

この方法では、キーと値の両方を利用しながら条件を判定できます。

複数の条件を組み合わせたり、各要素が配列になっていたりする場合にも利用しやすい方法です。

二次元配列から条件に一致する要素を削除する方法

foreachとunset()を利用する

実際のWebアプリケーションでは、単純な値の配列だけでなく、複数の情報を持つ二次元配列を扱うことがあります。

たとえば、次のようなユーザー情報があるとします。

$users = [
    ['name' => 'Taro', 'active' => true],
    ['name' => 'Jiro', 'active' => false],
    ['name' => 'Hanako', 'active' => true],
];

activefalseのユーザーを削除する場合は、次のように記述できます。

foreach ($users as $key => $user) {
    if ($user['active'] === false) {
        unset($users[$key]);
    }
}

$users = array_values($users);

unset()で対象の要素を削除したあと、array_values()によって数値インデックスを振り直しています。

このように、条件が複雑な場合にはforeachunset()の組み合わせが分かりやすいケースがあります。

多次元配列の特定要素を削除する方法

削除したい階層までキーを指定する

多次元配列であっても、削除対象のキーまで指定すればunset()を利用できます。

$user = [
    'name' => 'Taro',
    'profile' => [
        'age' => 30,
        'city' => 'Tokyo'
    ]
];

profileの中にあるageだけを削除したい場合は、次のように記述します。

unset($user['profile']['age']);

これによって、

$user['profile']['age']

だけが削除されます。

profile全体を削除したい場合は、

unset($user['profile']);

と記述します。

array_splice()で指定位置の要素を削除する方法

配列の位置を指定して削除する

数値インデックスの配列では、array_splice()を使用して要素を削除することもできます。

$fruits = ['apple', 'banana', 'orange'];

array_splice($fruits, 1, 1);

print_r($fruits);

結果は次のようになります。

Array
(
    [0] => apple
    [1] => orange
)

基本的な書式は次のとおりです。

array_splice($array, $offset, $length);

たとえば、

array_splice($fruits, 1, 1);

では、先頭から数えて位置1にある要素から1個を取り除きます。

array_splice()はキーではなく位置を指定する

array_splice()を使用するときに重要なのが、第2引数は基本的に「配列のキー」ではなく「配列内の位置」を表すという点です。

通常の、

['A', 'B', 'C']

のような数値キーが連続している配列では、キーと位置が一致するため違いが分かりにくいことがあります。

しかし、数値キーが飛び飛びになっている場合などには、キーを指定して削除するunset()とは考え方が異なります。

特定のキーを削除したい場合はunset()、配列の何番目から何個削除するかを指定したい場合はarray_splice()と考えると分かりやすいでしょう。

array_splice()では数値キーが再インデックスされる

array_splice()によって要素を取り除くと、数値キーは再インデックスされます。

そのため、

$fruits = ['apple', 'banana', 'orange'];

array_splice($fruits, 1, 1);

では、

0 => apple
1 => orange

となります。

unset()の場合のように、

0
2

と数値キーが飛び飛びになることを避けたい場合に便利です。

array_diff()で指定した値を除外する方法

複数の値をまとめて除外できる

複数の値を指定して配列から除外したい場合は、array_diff()も利用できます。

$fruits = ['apple', 'banana', 'orange', 'grape'];

$fruits = array_diff(
    $fruits,
    ['banana', 'orange']
);

print_r($fruits);

結果は次のようになります。

Array
(
    [0] => apple
    [3] => grape
)

bananaorangeが結果から除外されています。

array_diff()は元の配列を直接書き換えるのではなく、差分となる新しい配列を返します。

そのため、

$fruits = array_diff($fruits, ['banana', 'orange']);

のように戻り値を受け取ります。

array_diff()でもキーは保持される

array_diff()も元の配列のキーを保持します。

そのため、先ほどの例では、

0
3

というキーが残ります。

数値インデックスを振り直したい場合は、

$fruits = array_values(
    array_diff(
        $fruits,
        ['banana', 'orange']
    )
);

とします。

array_diff()は厳密な型比較を目的とした関数ではない

array_diff()を使う際には、比較方法にも注意が必要です。

array_diff()は、array_search()の第3引数にtrueを指定した場合のような、型まで含めた厳密比較を目的とした関数ではありません。

型まで明確に区別して要素を除外したい場合は、array_filter()と厳密比較演算子を組み合わせる方法があります。

$array = array_filter(
    $array,
    fn($value) => $value !== $target
);

整数の1と文字列の'1'などを区別したい場合には、このような処理のほうが意図を明確にできます。

nullを代入する方法とunset()の違い

nullを代入してもキーは削除されない

PHPでは、

$array['key'] = null;

としても、配列要素そのものが削除されるわけではありません。

たとえば、

$data = [
    'name' => 'Taro',
    'age' => 30
];

$data['age'] = null;

とすると、ageというキーは残ります。

概念的には、

[
    'name' => 'Taro',
    'age' => null
]

という状態です。

一方、

unset($data['age']);

を実行すると、ageというキーそのものが削除されます。

つまり、

$data['age'] = null;

は、

「キーは存在するが、値がnull

という状態です。

一方、

unset($data['age']);

は、

「キーそのものが存在しない」

という状態になります。

array_key_exists()ではnullでもキーの存在を確認できる

キーが存在するかどうかはarray_key_exists()で確認できます。

$data = ['age' => null];

var_dump(array_key_exists('age', $data));

結果は次のようになります。

bool(true)

値がnullであっても、ageというキー自体は存在しているためです。

nullを設定する処理と、配列要素を削除する処理は意味が異なるため注意しましょう。

存在しないキーをunset()した場合

削除だけが目的なら事前確認は必須ではない

配列に存在しないキーをunset()しても、単純な削除操作としては問題ありません。

たとえば、

$data = [
    'name' => 'Taro'
];

unset($data['age']);

のように、存在しないageを指定することができます。

そのため、単純に「存在していれば削除したい」という目的であれば、

if (isset($data['age'])) {
    unset($data['age']);
}

と毎回事前確認を行う必要はありません。

次のように直接記述できます。

unset($data['age']);

ただし、削除前に値を利用する処理などがある場合は、別途存在確認が必要になることがあります。

PHPで配列を削除する方法の使い分け

キーが分かっている場合はunset()

削除対象のキーが分かっている場合は、基本的にunset()を利用します。

unset($array[$key]);

単純で分かりやすく、連想配列にも数値配列にも使用できます。

値から1件だけ削除する場合はarray_search()とunset()

特定の値を探し、最初に見つかった要素を削除したい場合は、

array_search()

と、

unset()

を組み合わせます。

$key = array_search($target, $array, true);

if ($key !== false) {
    unset($array[$key]);
}

条件に応じて要素を除外する場合はarray_filter()

複数の要素を条件によって除外したい場合は、array_filter()が便利です。

$array = array_filter(
    $array,
    fn($value) => $value >= 10
);

「どの要素を残すのか」を条件として表現できるため、処理の意図を読み取りやすくできます。

配列の位置を基準に削除するならarray_splice()

「2番目から3個削除する」といったように、配列内の位置と件数を基準に削除したい場合はarray_splice()が適しています。

array_splice($array, 1, 3);

数値キーが再インデックスされる点も特徴です。

複数の指定値を除外するならarray_diff()

複数の値をまとめて結果から除外したい場合は、array_diff()を利用できます。

$result = array_diff(
    $array,
    $valuesToRemove
);

ただし、型まで厳密に比較したい場合には、array_filter()と厳密比較を利用する方法も検討するとよいでしょう。

PHPで配列の要素を削除するときの注意点

unset()ではインデックスが自動的に詰まらない

PHPで配列要素を削除するときに、特に注意したいポイントです。

$array = ['A', 'B', 'C'];

unset($array[1]);

この場合、結果は、

0 => A
2 => C

となります。

次のように、

0 => A
1 => C

へ自動的に変更されるわけではありません。

連続した数値キーが必要な場合は、

$array = array_values($array);

を利用しましょう。

値を削除するのかキーを削除するのかを区別する

PHPの配列削除では、

「キーが分かっているのか」

「値だけが分かっているのか」

によって適切な方法が異なります。

キーが分かっている場合は、

unset($array[$key]);

が基本です。

値しか分からない場合は、

array_search()

でキーを探してからunset()する方法などを利用します。

元の配列を変更する処理と新しい配列を返す処理を区別する

PHPの配列関数では、元の配列そのものに作用する方法と、処理結果として新しい配列を返す方法があります。

たとえば、

unset()

や、

array_splice()

は対象となる配列に作用します。

一方、

array_filter()

や、

array_diff()

や、

array_values()

は、処理結果となる配列を返します。

そのため、

$array = array_filter($array, $callback);

のように戻り値を受け取る必要があります。

この違いを理解しておくと、配列を削除したつもりなのに結果が変わっていない、といったミスを防ぎやすくなります。

PHPで配列の要素を削除する方法のまとめ

PHPで配列の要素を削除する場合、もっとも基本的な方法はunset()です。

削除したいキーが分かっているのであれば、

unset($array[$key]);

とするだけで対象の要素を削除できます。

ただし、数値インデックスの途中をunset()しても、残ったキーは自動的には振り直されません。

連続した数値インデックスが必要な場合は、

$array = array_values($array);

を利用します。

削除したい対象が値の場合には、

array_search()

unset()を組み合わせる方法があります。

同じ値をまとめて除外したり、特定の条件に応じて配列を絞り込んだりする場合には、array_filter()が便利です。

また、配列内の位置を指定して削除したい場合にはarray_splice()、複数の指定値をまとめて除外したい場合にはarray_diff()も利用できます。

PHPで配列を削除するときは、単に「要素を削除する」と考えるのではなく、キーを指定するのか、値を指定するのか、条件で除外するのか、削除後にインデックスを振り直す必要があるのかを整理してから方法を選ぶことが重要です。

目的に応じてunset()array_values()array_search()array_filter()array_splice()array_diff()を適切に使い分ければ、配列の削除処理を分かりやすく安全に実装できます。

以上、PHPで配列の要素を削除する方法についてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次