web-dev-qa-db-fra.com

Utiliser des opérateurs de comparaison dans PHP commutateur

Donc, j'ai quatre conditions à remplir et j'ai pensé qu'il serait préférable d'utiliser l'instruction switch en PHP. Cependant, je dois vérifier si un entier est, disons, inférieur ou égal, ou supérieur et égal.

switch ($count) {
    case 20:
        $priority = 'low';
        break;

    case 40:
        $priority = 'medium';
        break;

    case 60:
        $priority = 'high';
        break;

    case 80:
        $priority = 'severe';
        break;
}

Avec une instruction if(), cela ressemblerait à ceci:

if ($count <= 20) {
    $priority = 'low';
}

if ($count <= 40) {
    $priority = 'medium';
}

Est-ce possible dans switch-case?

29
Jessie Stalk

Un cas plus général pour résoudre ce problème est:

switch (true) {
    case $count <= 20:
        $priority = 'low';
        break;

    case $count <= 40:
        $priority = 'medium';
        break;

    case $count <= 60:
        $priority = 'high';
        break;

    default:
        $priority = 'severe';
        break;
}
98
Konr Ness

Les commutateurs ne peuvent pas faire cela, mais dans ce cas particulier, vous pouvez faire quelque chose comme ceci:

switch ((int)(($count - 1) / 20)) {
    case 0:
        $priority = 'low';
        break;
    case 1:
        $priority = 'medium';
        break;
    case 2:
        $priority = 'high';
        break;
    case 3:
        $priority = 'severe';
        break;
}

Ainsi, dans (int)(($count - 1) / 20), toutes les valeurs comprises entre 0 et 20 seront évaluées à 0, 21 à 40 seront évaluées à 1, etc., ce qui vous permettra d’utiliser l’instruction switch à cette fin.

Et puisque nous concaténons des valeurs, nous pouvons même simplifier un tableau:

$priorities = ['low', 'medium', 'high', 'severe'];
$priority = $priorities[(int)(($count - 1) / 20)];
3
Havenard

Il y a une manière qui fonctionne dans php 7 en utilisant des opérateurs d’assignation ternaires. L'opérateur a été introduit plus tôt (5.4?) Mais je n'ai jamais testé le code sur d'autres versions. J'ai écrit l'intégralité du code de commutateur , cependant, par souci de brièveté, voici juste l'article spécifique. Disons que nous voulons que la condition corresponde pour tous les nombres supérieurs ou égaux à cinq:

switch($value){
 case ($value >= 5?$value:!$value)://do something here
 break;
}     

Soit nous laissons la valeur $ inchangée, soit nous la nions en fonction de la condition. Une valeur $ correspondra toujours ou échouera au test contre sa négation.

2
bytephunk

Les instructions switch() servent à effectuer plusieurs tests d'égalité. Ils sont fondamentalement juste une version légèrement plus facile à lire (mais aussi plus dangereuse) de 

if (x == 'a') { ... }
else if (x == 'b') { ... } 
else if (x == 'c') { ... }

code. Il n'y a aucun moyen de changer une switch() de == en < ou tout autre opérateur de comparaison. C'est strictement pour le test d'égalité.

0
Marc B