2010-03-12 5 views
1

J'ai un tableau et une variable. Si la variable n'existe pas dans le tableau, elle doit être ajoutée, sinon elle doit être supprimée. Pourquoi le code suivant ne fonctionne pas?Insertion et suppression d'une chaîne dans/d'un tableau

$ar = ["a","b","c"]; 
$vr = "b"; 

foreach ($ar as $i => $value) { 
    if ($value == $vr) { 
     unset ($ar[$i]); 
    } else { 
     $ar[] = $vr; 
     $ar = array_unique($ar); 
    } 
} 

Merci.

+1

Syntaxe incorrecte, logique erronée, le fait que 'foreach' itère sur une copie du tableau ... par où commencer? –

Répondre

1

Je suppose que vous utilisez PHP, dans ce cas la déclaration de tableau n'est pas correcte, il devrait être:

$ar = array("a", "b", "c");

Le code dans votre question est assez complexe - et un peu de désordre, Je suis désolé de dire - pour ce que vous voulez qu'il fasse. Pour obtenir ce que vous voulez, vous pouvez utiliser array_search:

$valueExists = array_search($vr, $ar); 
if ($valueExists !== false) { 
    unset($ar[$valueExists]); 
} else { 
    $ar[] = $vr; 
} 

Cela va pousser la valeur à la fin du tableau si elle n'existe pas et supprime la valeur si elle le fait.

+1

Ne fonctionne pas. La valeur de retour de array_search peut être 0 (lorsque vous recherchez "a" dans cet exemple). Donc votre if ($ valueExists) échoue. Vous devez comparer $ valueExists avec false. – codaddict

+0

Vous avez raison, merci de l'avoir signalé. Corrigé – mensch

+0

0 est considéré comme faux. Vous devez comparer en utilisant if ($ valueExists! == false) -> Je vois que vous l'avez déjà corrigé;) – Tobias

0

tout d'abord l'appel à

array_unique() 

n'a pas de sens, parce que si la valeur était dans le tableau avant, vous voulez le supprimer .. vous devez briser votre boucle foreach à la place une fois que vous avez trouvé la clé et définissez un booléen comme keyFound = true.
Après votre boucle, vous pouvez vérifier si elle a été définie et sinon, insérez la variable dans votre tableau.
Avec votre code, vous insérez votre clé de recherche à chaque fois qu'une variable est comparée et qu'elles ne sont pas identiques.

0

Uhm ... tout un gâchis que vous avez là.

Vous devez utiliser array_search, selon mensch.

Voici votre code un peu "remasterisé" pour simplement travailler - à des fins d'apprentissage seulement.

<?php 

function toggle($ar, $vr) 
{ 
    $found = false; 
    foreach ($ar as $i => $value) 
    { 
     if ($value == $vr) 
     { 
      unset ($ar[$i]); 
      $found = true; 
     } 
    } 

    if (!$found) 
    { 
     $ar[] = $vr; 
     $ar = array_unique($ar); 
    } 
    return $ar; 
} 

function printArray($ar) 
{ 
    foreach ($ar as $i => $value) 
    { 
     echo ($value . " - "); 
    } 
    echo ("<br/>"); 
} 

$ar = array("a", "b", "c"); 

printArray($ar); 

$ar = toggle($ar, "b"); 

printArray($ar); 

$ar = toggle($ar, "k"); 

printArray($ar); 

?> 
0

Vous pouvez faire:

$ar = array("a","b","c"); 
$vr = "d"; 

if(($pos = array_search($vr,$ar)) !== false) 
    unset($ar[$pos]); 
else 
    $ar[] = $vr; 

d'abord, nous utilisons le array_search() pour voir si la valeur existe dans le tableau. La valeur de retour de array_search() est false si la valeur n'existe pas et renvoie la clé correspondante si la valeur existe. Nous vérifions donc la valeur de retour avec false. Nous collectons également la valeur de retour dans une variable appelée $pos. Si la clé existe, nous supprimons la valeur du tableau en utilisant la méthode unset() et si la valeur n'existe pas, nous l'ajoutons.

Questions connexes