PHP Supprimer des éléments du tableau associatif

100

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 du 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 Terminé et Marquer comme 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.

Existe-t-il un moyen de les supprimer en faisant correspondre le nom de la valeur au lieu de la valeur de clé?

user648198
la source
ne sais pas si je comprends la question à portée de main ici? Que voulez-vous dire parfois le numéro d'index peut être différent?
Simon H

Réponses:

153

Votre tableau est assez étrange: pourquoi ne pas utiliser simplement le keyas index et le valueas ... la valeur?

Ne serait-il 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 keycomme index pour accéder au tableau ...

Et vous pourrez utiliser des fonctions pour rechercher les 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 baie, 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 boucler sur tous les éléments, analyser valueet annuler 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 clé / valeur plus simple?

Pascal MARTIN
la source
"Vous devrez boucler sur tous les éléments, pour analyser la valeur". Lorsque vous utilisez array_search, vous pouvez également rechercher dans tous les éléments.
Nicolas Aoki
96
  ...

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



  return array_values($array);
  ...
ADFS
la source
3
Merci, je ne recherchais que ceci.! :)
Ravi Dhoriya ツ
2
agréable et facile. juste à la recherche de ça
Faisal Mehmood Awan
C'est la vraie réponse, pas celle qui a été vérifiée.
A.Seddighi
16
$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]);
    }
}
Dejan Marjanović
la source
7

Vous pouvez utiliser ceci

unset($dataArray['key']);
Anirban Das
la source
3

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 simplement que votre tableau serait réindexé.

Mikel Annjuk
la source
1

Essaye ça:

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

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

Alp
la source
0

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

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

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

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

Je ne suis pas d'accord avec la réponse acceptée. Parfois, une architecture d'application ne veut pas que vous manipuliez l'ID du 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 en tant que valeur dans chaque enregistrement, très similaire à ce qui précède.

En supposant que le tableau n'est pas stupidement grand, j'utiliserais array_filter. Cela créera une copie du tableau, moins les enregistrements que vous souhaitez supprimer, que vous pouvez réattribuer à la variable de tableau d'origine.

Bien que cela puisse sembler inefficace, il est en fait très en vogue ces jours-ci d'avoir des variables immuables, et le fait que la plupart des fonctions de tableau php renvoient un nouveau tableau plutôt que de passer à l'original implique que PHP veut un peu que vous fassiez cela aussi. Et plus vous travaillez avec des tableaux et que vous réalisez à quel point la fonction unset () est difficile et ennuyeuse, 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 (par exemple votre champ id) dans la fonction intégrée que vous voulez.

Roger Kaplan
la source
-1

pour une utilisation d'élément de tableau unique reset($item)

Ivan Proskuryakov
la source
La fonction de réinitialisation doit être utilisée pour déplacer le pointeur de tableau interne, pas pour supprimer des éléments ou annuler des éléments d'un tableau. Utilisez plutôt unset. Si votre solution fonctionne même, elle a également des effets secondaires indésirables.
David le