Suppression d'un élément d'un tableau en PHP

Existe-t-il un moyen simple de supprimer un élément d'un tableau en utilisant PHP, de sorte que foreach ($array) n'inclue plus cet élément ?

Je pensais que le mettre à null le ferait, mais apparemment cela ne fonctionne pas.

Solution

Il existe différentes façons de supprimer un élément de tableau, certaines étant plus utiles que d'autres pour certaines tâches spécifiques.

Suppression d'un élément du tableau

Si vous souhaitez supprimer un seul élément d'un tableau, vous pouvez utiliser [unset()`][1] ou [array_splice()`][2].

De même, si vous avez la valeur et que vous ne connaissez pas la clé pour supprimer l'élément, vous pouvez utiliser [`array_search()][3] pour obtenir la clé.

La méthode [`unset()][4]

Notez que lorsque vous utilisez unset()`, les clés du tableau ne seront pas modifiées ou réindexées. Si vous voulez réindexer les clés, vous pouvez utiliser la méthode [`\array_values()`][5] aprèsunset()` qui convertira toutes les clés en clés numériques énumérées à partir de 0.

Code

<?php

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

?>

Sortie

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

Méthode ###[`array_splice()][6]

Si vous utilisez array_splice()`, les clés seront automatiquement réindexées, mais les clés associatives ne changeront pas, contrairement àarray_values()` qui convertira toutes les clés en clés numériques.

De plus, \array_splice() a besoin du décalage, et non de la clé ! comme deuxième paramètre.

Code

<?php

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

?>

Sortie

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

array_splice() comme `unset() prennent le tableau par référence, et cela signifie que vous ne voulez pas réaffecter les valeurs de retour de ces fonctions au tableau.

Suppression de plusieurs éléments d'un tableau

Si vous voulez supprimer plusieurs éléments d'un tableau et que vous ne voulez pas appeler plusieurs fois unset()` ouarray_splice(), vous pouvez utiliser les fonctions ``array_diff() ou `array_diff_key() selon que vous connaissez les valeurs ou les clés des éléments que vous voulez supprimer.

Méthode ###[\array_diff()] [7]

Si vous connaissez les valeurs des éléments du tableau que vous voulez supprimer, vous pouvez utiliser array_diff(). Comme précédemment avec `unset(), cela ne modifiera pas la réindexation des clés du tableau.

Code

<?php

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

?>

Sortie

[
    [1] => b
]

Méthode ###[\array_diff_key()][8]

Si vous connaissez les clés des éléments que vous souhaitez supprimer, vous pouvez utiliser la méthode `array_diff_key(). Ici, vous devez vous assurer que vous passez les clés comme clés dans le deuxième paramètre et non comme valeurs. Sinon, vous devez retourner le tableau avec [\array_flip()][9]. Et ici aussi, les clés ne seront pas modifiées ou réindexées.

Code

<?php

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

Sortie

[
    [1] => b
]

De plus, si vous voulez utiliser unset()` ouarray_splice()pour supprimer plusieurs éléments ayant la même valeur, vous pouvez utiliser [``array_keys()][10] pour obtenir toutes les clés pour une valeur spécifique et ensuite supprimer tous les éléments.

[1] : https://secure.php.net/manual/en/function.unset.php [2] : https://secure.php.net/manual/en/function.array-splice.php [3] : http://php.net/manual/en/function.array-search.php [4] : http://php.net/manual/en/function.unset.php [5] : http://php.net/manual/en/function.array-values.php [6] : http://php.net/manual/en/function.array-splice.php [7] : http://php.net/manual/en/function.array-diff.php [8] : http://php.net/manual/en/function.array-diff-key.php [9] : http://php.net/manual/en/function.array-flip.php [10] : http://php.net/manual/en/function.array-keys.php

Commentaires (9)

Il faut noter que [unset()][1] conservera les index intacts, ce qui est ce à quoi on s&#8217attend lorsqu&#8217on utilise des index de chaînes de caractères (tableau comme table de hachage), mais qui peut être assez surprenant lorsqu&#8217on a affaire à des tableaux indexés sur des entiers :

$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)
} */

Donc [array_splice()][2] peut être utilisé si vous souhaitez normaliser vos clés entières. Une autre option consiste à utiliser [array_values()][3] après [unset()][1] :

$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)
} */

[1] : http://php.net/unset [2] : http://php.net/array_splice [3] : http://php.net/array_values

Commentaires (8)
unset($array[$index]);
Commentaires (0)