2010-12-02 35 views
1

Je voudrais transformer mon cas() sous condition de changer() de ceci:If() vs switch() - Même signification mais comportement différent?

if($configuration['application'][$applicationName]['subdomain'] == true){ 
    foreach($configuration['language'] as $language){ 
     if($language['abbreviation'].'.'.$configuration['application'][$applicationName]['domain'] == $_SERVER['HTTP_HOST']){ 
      $_SESSION['language'] = $language['abbreviation']; 
     } 
    } 

    // If no subdomain detected and redirection is enabled, set default language 
    if(!isset($_SESSION['language'])){ 
     $_SESSION['language'] = $configuration['application'][$applicationName]['language']; 
    } 
} 
else { 
    $_SESSION['language'] = $configuration['application'][$applicationName]['language']; 
} 

à ceci:

switch($configuration['application'][$applicationName]['subdomain']){ 
    case true: 
     foreach($configuration['language'] as $language){ 
      if($language['abbreviation'].'.'.$configuration['application'][$applicationName]['domain'] == $_SERVER['HTTP_HOST']){ 
       $_SESSION['language'] = $language['abbreviation']; 
       break; 
      } 
     } 
    default: 
     $_SESSION['language'] = $configuration['application'][$applicationName]['language']; 
     break; 
} 

Je pense que ce devrait être la même, mais il se comporte différemment ... Le commutateur ne fonctionne pas correctement ...

+2

Quel type de données est stocké dans '$ configuration ['application'] [$ applicationName] ['subdomain']'? Est-ce vraiment booléen, ou il y a une sorte de chaîne ou un entier, qui est implicitement casté en bool dans la version 'if'? – NOtherDev

+0

La programmation spécifique (PHP?) Que vous utilisez peut être importante ici; aussi une description de la façon dont il se comporte différemment (le 'break' qui a été ajouté à la boucle' foreach' pourrait-il changer votre comportement attendu?). –

+0

Eh bien j'utilise php et $ configuration ['application'] [$ applicationName] ['subdomain'] est booléen (il est lu à partir de .ini et typecasted à bool) ... Et la chose est que le code dans foreach est executé et default est aussi exécuté (break ne casse pas vraiment le switch?) – jzvelc

Répondre

1

J'ai reformaté votre code, veuillez vous assurer qu'il est toujours correct. En ce qui concerne votre problème, pour commencer, il manque une instruction break; à la fin de votre instruction case true:. (Le break à l'intérieur de la boucle foreach sort tout simplement de cette boucle, pas le case lui-même).

+0

Eh bien c'est intéressant, je pensais que break devrait quitter le switch (je pense que c'est comme ça en C++) ... Mon intention était que si session est définie dans le cas vrai, il devrait quitter le commutateur, sinon il devrait continuer à cas par défaut, puis faire la pause ... – jzvelc

+0

Et oui, le code que vous avez formaté est toujours correct. – jzvelc

+0

Je viens de comprendre que le problème est la rupture à l'intérieur foreach loop. Cela ne fonctionne tout simplement pas ... Après que la session est définie dans l'instruction if, elle continue à être définie par défaut et redéfinit la session, ce qui pose problème. – jzvelc