web-dev-qa-db-fra.com

PHP Supprimer les éléments d'un tableau associatif

J'ai un tableau PHP qui ressemble à ceci:

Index              Key     Value
[0]                1       Awaiting for Confirmation
[1]                2       Assigned
[2]                3       In Progress
[3]                4       Completed
[4]                5       Mark As Spam

Quand je var_dump les valeurs de tableau j'obtiens ceci:

array(5) { [0]=> array(2) { ["key"]=> string(1) "1" ["value"]=> string(25) "Awaiting for Confirmation" } [1]=> array(2) { ["key"]=> string(1) "2" ["value"]=> string(9) "Assigned" } [2]=> array(2) { ["key"]=> string(1) "3" ["value"]=> string(11) "In Progress" } [3]=> array(2) { ["key"]=> string(1) "4" ["value"]=> string(9) "Completed" } [4]=> array(2) { ["key"]=> string(1) "5" ["value"]=> string(12) "Mark As Spam" } }

Je voulais supprimer Completed et Mark As Spam. Je sais que je peux unset[$array[3],$array[4]), mais le problème est que parfois, le numéro d'index peut être différent.

Est-il possible de les supprimer en faisant correspondre le nom de la valeur au lieu de la valeur de la clé?

95
user648198

Votre tableau est assez étrange: pourquoi ne pas utiliser simplement le key comme index et le value comme ... la valeur?

Ne serait-ce pas beaucoup plus facile si votre tableau était déclaré comme ceci:

$array = array(
    1 => 'Awaiting for Confirmation', 
    2 => 'Asssigned', 
    3 => 'In Progress', 
    4 => 'Completed', 
    5 => 'Mark As Spam', 
);

Cela vous permettrait d'utiliser vos valeurs de key comme index pour accéder au tableau ...

Et vous seriez en mesure d'utiliser des fonctions pour rechercher des valeurs, telles que array_search() :

$indexCompleted = array_search('Completed', $array);
unset($array[$indexCompleted]);

$indexSpam = array_search('Mark As Spam', $array);
unset($array[$indexSpam]);

var_dump($array);

Plus facile qu'avec votre tableau, non?



Au lieu de cela, avec votre tableau qui ressemble à ceci:

$array = array(
    array('key' => 1, 'value' => 'Awaiting for Confirmation'), 
    array('key' => 2, 'value' => 'Asssigned'), 
    array('key' => 3, 'value' => 'In Progress'), 
    array('key' => 4, 'value' => 'Completed'), 
    array('key' => 5, 'value' => 'Mark As Spam'), 
);

Vous devrez parcourir tous les éléments, analyser la value et désélectionner les bons éléments:

foreach ($array as $index => $data) {
    if ($data['value'] == 'Completed' || $data['value'] == 'Mark As Spam') {
        unset($array[$index]);
    }
}
var_dump($array);

Même si c'est faisable, ce n'est pas si simple ... et j'insiste: ne pouvez-vous pas changer le format de votre tableau, pour travailler avec un système plus simple clé/valeur?

147
Pascal MARTIN
  ...

  $array = array(
      1 => 'Awaiting for Confirmation', 
      2 => 'Asssigned', 
      3 => 'In Progress', 
      4 => 'Completed', 
      5 => 'Mark As Spam', 
  );



  return array_values($array);
  ...
95
ADFS
$key = array_search("Mark As Spam", $array);
unset($array[$key]);

Pour les tableaux 2D ...

$remove = array("Mark As Spam", "Completed");
foreach($arrays as $array){
    foreach($array as $key => $value){
        if(in_array($value, $remove)) unset($array[$key]);
    }
}
13
Dejan Marjanovic

Vous pouvez utiliser ceci

unset($dataArray['key']);
4
Anirban Das

Pourquoi ne pas utiliser array_diff?

$array = array(
    1 => 'Awaiting for Confirmation', 
    2 => 'Asssigned', 
    3 => 'In Progress', 
    4 => 'Completed', 
    5 => 'Mark As Spam', 
);
$to_delete = array('Completed', 'Mark As Spam');
$array = array_diff($array, $to_delete);

Notez juste que votre tableau serait réindexé.

3
Mikel Annjuk

Essaye ça:

$keys = array_keys($array, "Completed");

Comme indiqué par JohnP, cette méthode ne fonctionne que pour les tableaux non imbriqués.

1
Alp

Pour ce faire, prenez votre tableau cible imbriqué et copiez-le en une étape dans un tableau non imbriqué. Supprimez la ou les clés, puis affectez le dernier tableau découpé au nœud imbriqué du tableau précédent. Voici un code pour le rendre simple:

$temp_array = $list['resultset'][0];

unset($temp_array['badkey1']);
unset($temp_array['badkey2']);

$list['resultset'][0] = $temp_array;
0
Nitish Pandey

Je suis un peu en désaccord avec la réponse acceptée. Parfois, une architecture d'application ne veut pas que vous fassiez des erreurs avec l'ID de tableau ou le rende peu pratique. Par exemple, j'utilise beaucoup CakePHP, et une requête de base de données renvoie la clé primaire sous forme de valeur dans chaque enregistrement, très similaire à la précédente.

En supposant que le tableau ne soit pas bêtement grand, j'utiliserais array_filter. Cela créera une copie du tableau, moins les enregistrements que vous souhaitez supprimer, que vous pourrez réaffecter à la variable de tableau d'origine.

Bien que cela puisse sembler inefficace, il est actuellement très courant que les variables soient immuables, et le fait que la plupart des fonctions de tableau php renvoient un nouveau tableau plutôt que de jouer avec l'original implique que PHP veut un peu que vous le fassiez. fais ça aussi. Et plus vous travaillez avec des tableaux et vous réalisez à quel point la fonction unset () est difficile et gênante, cette approche a beaucoup de sens.

En tous cas:

$my_array = array_filter($my_array, 
                         function($el) { 
                            return $el["value"]!="Completed" && $el!["value"]!="Marked as Spam"; 
                         });

Vous pouvez utiliser n’importe quelle logique d’inclusion (votre champ id, par exemple) dans la fonction intégrée souhaitée.

0
Roger Kaplan