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

2008年12月16日に質問されました。  ·  閲覧回数 2.8M回  ·  ソース

Ben picture
2008年12月16日

foreach ($array)にその要素が含まれなくなるように、PHPを使用して配列から要素を削除する簡単な方法はありますか?

nullすればうまくいくと思いましたが、どうやらうまくいきません。

回答

Konrad Rudolph picture
2008年12月16日
3034

配列要素を削除するにはさまざまな方法があり、特定のタスクには他のタスクよりも役立つものがあります。

単一の配列要素を削除する

配列要素を1つだけ削除する場合は、 unset()または\array_splice()を使用できます。

値がわかっていて、要素を削除するためのキーがわからない場合は、 \array_search()を使用してキーを取得できます。 \array_searchは最初のヒットのみを返すため、これは要素が複数回出現しない場合にのみ機能します。

unset()

unset() 、配列キーは変更されないことに注意してください。 あなたがキーのインデックスを再作成したい場合は、使用することができます\array_values()の後にunset() 0から始まる数値的に列挙されたキーにすべてのキーを変えるであろう。

コード:

$array = [0 => "a", 1 => "b", 2 => "c"];
unset($array[1]);
          // ↑ Key which you want to delete

出力:

[
    [0] => a
    [2] => c
]

\array_splice()メソッド

\array_splice()使用すると、キーのインデックスが自動的に再作成されますが、すべてのキーを数値キーに変換する\array_values()とは対照的に、関連付けキーは変更されません。

\array_splice()は、2番目のパラメーターとして、キーではなくオフセットを必要とします。

コード:

$array = [0 => "a", 1 => "b", 2 => "c"];
\array_splice($array, 1, 1);
                   // ↑ Offset which you want to delete

出力:

[
    [0] => a
    [1] => c
]

array_splice()unset()と同じで、参照によって配列を取得します。 これらの関数の戻り値を配列に割り当てることはありません。

複数の配列要素を削除する

複数の配列要素を削除し、 unset()または\array_splice()複数回呼び出したくない場合は、関数\array_diff()または\array_diff_key()使用できます。削除する要素の値またはキーを知っているかどうか。

\array_diff()メソッド

削除する配列要素の値がわかっている場合は、 \array_diff()使用できます。 以前のunset()と同様に、配列のキーは変更されません。

コード:

$array = [0 => "a", 1 => "b", 2 => "c", 3 => "c"];
$array = \array_diff($array, ["a", "c"]);
                          // └────────┘
                          // Array values which you want to delete

出力:

[
    [1] => b
]

\array_diff_key()メソッド

削除する要素のキーがわかっている場合は、 \array_diff_key()を使用します。 キーを値としてではなく、2番目のパラメーターのキーとして渡すようにする必要があります。 キーはインデックスを再作成しません。

コード:

$array = [0 => "a", 1 => "b", 2 => "c"];
$array = \array_diff_key($array, [0 => "xy", "2" => "xy"]);
                               // ↑           ↑
                               // Array keys which you want to delete

出力:

[
    [1] => b
]

unset()または\array_splice()を使用して同じ値の複数の要素を削除する場合は、 \array_keys()を使用して特定の値のすべてのキーを取得してから、すべての要素を削除できます。

Stefan Gehrig picture
2008年12月16日
1372

unset()はインデックスを変更せずに保持することに注意してください。これは、文字列インデックス(ハッシュテーブルとしての配列)を使用する場合に期待されることですが、整数のインデックス付き配列を扱う場合は非常に驚く可能性があります。

$array = array(0, 1, 2, 3);
unset($array[2]);
var_dump($array);
/* array(3) {
  [0]=>
  int(0)
  [1]=>
  int(1)
  [3]=>
  int(3)
} */

$array = array(0, 1, 2, 3);
array_splice($array, 2, 1);
var_dump($array);
/* array(3) {
  [0]=>
  int(0)
  [1]=>
  int(1)
  [2]=>
  int(3)
} */

したがって、整数キーを正規化したい場合は、 array_splice()を使用できます。 別のオプションは、 array_values()後にunset()です。

$array = array(0, 1, 2, 3);

unset($array[2]);
$array = array_values($array);
var_dump($array);
/* array(3) {
  [0]=>
  int(0)
  [1]=>
  int(1)
  [2]=>
  int(3)
} */
Marcel Cozma picture
2011年08月02日
385
  // Our initial array
  $arr = array("blue", "green", "red", "yellow", "green", "orange", "yellow", "indigo", "red");
  print_r($arr);

  // Remove the elements who's values are yellow or red
  $arr = array_diff($arr, array("yellow", "red"));
  print_r($arr);

これは上記のコードからの出力です:

Array
(
    [0] => blue
    [1] => green
    [2] => red
    [3] => yellow
    [4] => green
    [5] => orange
    [6] => yellow
    [7] => indigo
    [8] => red
)

Array
(
    [0] => blue
    [1] => green
    [4] => green
    [5] => orange
    [7] => indigo
)

これで、array_values()は数値配列のインデックスを適切に再作成しますが、配列からすべてのキー文字列を削除し、それらを数値に置き換えます。 キー名(文字列)を保持する必要がある場合、またはすべてのキーが数値の場合は配列のインデックスを再作成する必要がある場合は、array_merge()を使用します。

$arr = array_merge(array_diff($arr, array("yellow", "red")));
print_r($arr);

出力

Array
(
    [0] => blue
    [1] => green
    [2] => green
    [3] => orange
    [4] => indigo
)
liamvictor picture
2011年11月15日
212
$key = array_search($needle, $array);
if ($key !== false) {
    unset($array[$key]);
}
Eran Galperin picture
2008年12月16日
90
unset($array[$index]);
DefenestrationDay picture
2010年07月31日
67

また、名前付き要素の場合:

unset($array["elementName"]);
Robin Nixon picture
2012年11月26日
67

すべての値が一意である(または一意ではないが特定の値のすべてのインスタンスを削除したい)数値インデックス付き配列がある場合は、array_diff()を使用して、次のように一致する要素を削除できます。

$my_array = array_diff($my_array, array('Value_to_remove'));

例えば:

$my_array = array('Andy', 'Bertha', 'Charles', 'Diana');
echo sizeof($my_array) . "\n";
$my_array = array_diff($my_array, array('Charles'));
echo sizeof($my_array);

これにより、次が表示されます。

4
3

この例では、値が「Charles」の要素が削除されます。これは、初期配列のサイズが4、削除後に3のサイズを報告するsizeof()呼び出しで確認できます。

Saurabh Chandra Patel picture
2013年06月11日
35
<?php
    $stack = ["fruit1", "fruit2", "fruit3", "fruit4"];
    $fruit = array_shift($stack);
    print_r($stack);

    echo $fruit;
?>

出力:

[
    [0] => fruit2
    [1] => fruit3
    [2] => fruit4
]

fruit1
KTAnj picture
2015年07月19日
34

配列の単一の要素を破棄します

unset()

$array1 = array('A', 'B', 'C', 'D', 'E');
unset($array1[2]); // Delete known index(2) value from array
var_dump($array1);

出力は次のようになります。

array(4) {
  [0]=>
  string(1) "A"
  [1]=>
  string(1) "B"
  [3]=>
  string(1) "D"
  [4]=>
  string(1) "E"
}

配列のインデックスを再作成する必要がある場合:

$array1 = array_values($array1);
var_dump($array1);

その場合、出力は次のようになります。

array(4) {
  [0]=>
  string(1) "A"
  [1]=>
  string(1) "B"
  [2]=>
  string(1) "D"
  [3]=>
  string(1) "E"
}

配列の最後から要素をポップします-削除された要素の値を返します

mixed array_pop(array &$array)

$stack = array("orange", "banana", "apple", "raspberry");
$last_fruit = array_pop($stack);
print_r($stack);
print_r('Last Fruit:'.$last_fruit); // Last element of the array

出力は次のようになります

Array
(
    [0] => orange
    [1] => banana
    [2] => apple
)
Last Fruit: raspberry

配列から最初の要素(赤)を削除します-削除された要素の値を返します

mixed array_shift ( array &$array )

$color = array("a" => "red", "b" => "green" , "c" => "blue");
$first_color = array_shift($color);
print_r ($color);
print_r ('First Color: '.$first_color);

出力は次のようになります。

Array
(
    [b] => green
    [c] => blue
)
First Color: red
Mugoma J. Okomba picture
2016年09月22日
27

検索を避けるために、 array_diff遊ぶことができます:

$array = array(3, 9, 11, 20);
$array = array_diff($array, array(11) ); // removes 11

この場合、キーを検索/使用する必要はありません。