98 votes

Meilleure façon de supprimer plusieurs éléments d'un tableau

Le problème ici est que j'ai un tableau avec 17 éléments. Je veux récupérer les éléments dont j'ai besoin pendant un certain temps et les supprimer définitivement du tableau.

Voici le code :

$name = $post['name'];
$email = $post['email'];
$address = $post['address'];
$telephone = $post['telephone'];
$country = $post['country'];

unset($post['name']);
unset($post['email']);
unset($post['address']);
unset($post['telephone']);
unset($post['country']);

Oui le code est moche, pas besoin de faire du bash. Comment puis-je l'améliorer ?

144voto

Tim Points 183

Utilisez array_diff_key de supprimer

$remove = ['telephone', 'country'];

array_diff_key($post, array_flip($remove));

Vous pourriez utiliser array_intersect_key si vous voulez fournir un tableau de clés à conserver.

7 votes

Je ne comprends pas pourquoi cette méthode n'est pas acceptée comme la réponse gagnante puisqu'elle fonctionne comme un charme !

0 votes

Brillant ! Bien joué. J'aime bien cette méthode, qui évite de faire une boucle sur le tableau et d'en annuler les éléments.

1 votes

Une solution intelligente !

104voto

alex Points 186293

Il semble que la fonction extract() serait un meilleur outil pour ce que vous essayez de faire (en supposant qu'il s'agit d'extraire toutes les clés/valeurs d'un tableau et de les affecter à des variables portant le même nom que les clés dans la portée locale). Une fois que vous avez extrait le contenu, vous pouvez alors annuler l'ensemble de la fonction $post en supposant qu'il ne contenait rien d'autre que ce que vous vouliez.

Cependant, pour répondre à votre question, vous pourriez créer un tableau des clés que vous souhaitez supprimer et le parcourir en boucle, en les désactivant explicitement...

$removeKeys = array('name', 'email');

foreach($removeKeys as $key) {
   unset($arr[$key]);
}

...ou vous pouvez faire pointer la variable vers un nouveau tableau dont les clés ont été supprimées...

$arr = array_diff_key($arr, array_flip($removeKeys));

...ou passer tous les membres du tableau à unset() ...

unset($arr['name'],  $arr['email']);

9 votes

array_diff_key() est une bonne solution. J'ai pensé ajouter que vous pouvez utiliser array_intersect_key() de faire l'inverse, de ne conserver que certains éléments

1 votes

Je suis d'accord avec bbradley - array_diff_key est une excellente solution.

0 votes

Par hasard, je faisais justement ce truc avec le foreach unset. Puis j'ai pensé qu'il pouvait y avoir une meilleure solution. Google m'a conduit ici. J'ai donc essayé array_diff_key et il s'avère qu'il est beaucoup plus lent que foreach pour les grands tableaux d'entrée (au moins quand le nombre de clés à unset est relativement petit.).

54voto

CodingDaily Points 11

Il existe un autre moyen qui est meilleur que les exemples ci-dessus. Source : http://php.net/manual/en/function.unset.php

Au lieu de parcourir en boucle l'ensemble du tableau et d'en annuler toutes les clés, vous pouvez l'annuler une seule fois comme suit :

Exemple de tableau :

$array = array("key1", "key2", "key3");

Pour l'ensemble du tableau :

unset($array);

Pour les clés uniques :

unset($array["key1"]);

Pour les clés multiples dans un tableau :

unset($array["key1"], $array["key2"], $array["key3"] ....) and so on.

J'espère que cela vous aidera dans votre développement.

4voto

Felix Imafidon Points 23

Je comprends que cette question est ancienne, mais je pense qu'un moyen optimal pourrait être de faire ceci :

$vars = array('name', 'email', 'address', 'phone'); /* needed variables */
foreach ($vars as $var) {
    ${$var} = $_POST[$var]; /* create variable on-the-fly */
    unset($_POST[$var]); /* unset variable after use */
}

Maintenant, vous pouvez utiliser $name, $email, ... de n'importe où ;)

NB : extract() n'est pas sûr, il est donc totalement hors de question !

1 votes

Par curiosité, pourquoi la méthode extract() n'est-elle pas sûre ?

0 votes

0 votes

Oh ! Elle est bonne ! Merci !

2voto

ahmedkandil Points 59
<?php
   $name = $post['name'];
   $email = $post['email'];
   $address = $post['address'];
   $telephone = $post['telephone'];
   $country = $post['country'];

   $myArray = array_except($post, ['name', 'email','address','telephone','country']);

  print_r($myArray);

  function array_except($array, $keys){
    foreach($keys as $key){
        unset($array[$key]);
    }
    return $array;
  }
?>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X