-1
votes

Condition de cas du commutateur pour une chaîne vide

entrez la description de l'image ici

Je ne peux pas expliquer ça

public static function getIconBaseOnOS($os)
{

    switch ($os) {


        case (strpos($os, 'Win64') !== false):
        $icon = 'windows';
        break;

        case (strpos($os, 'WOW64') !== false):
        $icon = 'windows';
        break;

        case (strpos($os, 'iPhone') !== false):
        $icon = 'iphone';
        break;

        case (strpos($os, 'Mac') !== false):
        $icon = 'mac';
        break;

        case (strpos($os, 'Linux') !== false):
        $icon = 'linux';
        break;

        case (strpos($os, 'Android') !== false):
        $icon = 'android';
        break;

        case (strpos($os, 'Crawler') !== false):
        $icon = 'crawler';
        break;

        case (strpos($os, 'compatible') !== false):
        $icon = 'compatible';
        break;


        case (strpos($os, 'bot') !== false):
        $icon = 'bot';
        break;


        case '':
        $icon = 'na';
        break;

        case strlen($os) == 0:
        $icon = 'na';
        break;

        default:
        $icon = 'na';


    }

    return $icon;

}

2 premières lignes

Mon OS clairement == vide && length == 0.

Je ne sais pas pourquoi ce cas ne déclenche pas $icon = 'na'; , mais au lieu de cela, il a continué à afficher l'icône windows !! 🤦🠻« Comment?

php

14 commentaires

switch ($os) case (strpos($os, 'Win64') !== false) équivaut à if ($os == (strpos($os, 'Win64') !== false)) . Utiliser un interrupteur ici n'a aucun sens.


Je ne te comprends pas. Ma condition est-elle mauvaise?


J'ai suivi le document PHP pour vérifier si la chaîne contient.


php.net/manual/en/function.strpos.php


Le problème n'est pas l'utilisation de strpos , le problème est la mauvaise utilisation d'un boîtier de commutateur


@deceze Pourquoi devrais-je if-else alors que j'ai environ 15 cas, et plus? Je m'en tiens au boîtier de commutation tous les jours.


@Cid Care pour m'éclairer? J'espère apprendre de vous la bonne façon d'utiliser le commutateur en PHP. ;)


Je tape une réponse, espérons que cela vous aidera


Je suis cette réponse d'ici: stackoverflow.com/a/7801218/4480164


c'est différent, vous comparez $os avec le résultat de (strpos($os, 'Win64') !== false)


switch est un raccourci si les valeurs comparées sont des valeurs constantes. switch ($foo) case 'bar': Vous n'avez pas ça. Vous avez des conditions if..else .


Les problèmes sont beaucoup plus simples que ça les gars ... j'ai ajouté dans la réponse. Il n'y a aucun problème avec mes conditions.


@deceze Il existe un moyen de faire des conditions dans des cas de commutation, des codes plus propres;)


Qu'y a-t-il de plus propre à exiger une break supplémentaire pour chaque cas, puisque vous n'êtes même pas intéressé par le comportement de chute du switch ?


4 Réponses :


0
votes

J'ai trouvé ma propre erreur

Au lieu de

switch ($os) {

je devrais faire

switch (true) {

Cela fonctionne parfaitement maintenant.

entrez la description de l'image ici


0 commentaires

3
votes

Ce n'est pas ainsi que fonctionnent les boîtiers de commutation.

Comme indiqué Deceze dans les commentaires, " switch ($os) case (strpos($os, 'Win64') !== false) équivaut à if ($os == (strpos($os, 'Win64') !== false)) "

Par exemple, si l'entrée est 'iPhone' , dans le switch / case la première condition non fausse sera celle-ci: case (strpos($os, 'iPhone') !== false):

En l'exécutant étape par étape, vous obtenez:

function getIconBaseOnOS($os)
{
    $osArray = [
        'Win64'      => 'windows',
        'WOW64'      => 'windows',
        'iPhone'     => 'iphone',
        'Mac'        => 'mac',
        'Linux'      => 'linux',
        'Android'    => 'android',
        'Crawler'    => 'crawler',
        'compatible' => 'compatible',
        'bot'        => 'bot'
    ];

    foreach ($osArray as $osName => $iconName )
    {
        if (strpos($os, $osName) !== false)
        {
            return $iconName;
        }
    }
    
    return 'na';
}

Maintenant, supposons que vous passiez une chaîne vide.

strpos('', 'Win64'); // false

false !== false // false

'' == false // true ! an empty string is considered as a falsy value.

Je conseillerais de se débarrasser du boîtier du commutateur et d'utiliser un tableau à la place, comme

strpos('iPhone', 'iPhone'); //0

0 !== false // true

'iPhone' == true // true ('iPhone', or any non empty string is a non falsy value, hence the condition being true)


2 commentaires

L'idée avec le tableau est très bonne. Mieux encore, passez le $ osArray comme paramètre à la fonction. +1 de moi.


Merci Cid, j'aime beaucoup ton idée. Ajustement de mon code;)



0
votes

J'espère que ce serait une façon optimisée de le faire, comme vous l'avez préféré, mais il y a trop de meilleures façons de faire la même chose.

// if empty string return whatever you want
if (strlen($os) <=0) 
    return  'na';

//when string is not empty 
switch ($os) {
    //when you need to run OR condition
    case (strpos($os, 'WOW64') !== false):
    case (strpos($os, 'Win64') !== false):
        $icon = 'windows';
        break;
    case (strpos($os, 'iPhone') !== false):
        $icon = 'iphone';
        break;
    case (strpos($os, 'Mac') !== false):
        $icon = 'mac';
        break;
    case (strpos($os, 'Linux') !== false):
        $icon = 'linux';
        break;
    case (strpos($os, 'Android') !== false):
        $icon = 'android';
        break;
    case (strpos($os, 'Crawler') !== false):
        $icon = 'crawler';
        break;
    case (strpos($os, 'compatible') !== false):
        $icon = 'compatible';
        break;
    case (strpos($os, 'bot') !== false):
        $icon = 'bot';
        break;
    default:
        $icon = 'na';
}
return $icon;


0 commentaires

0
votes

L'instruction Switch compare uniquement la valeur de la variable que vous lui transmettez.

$var = null;

switch($var)
{
    case null:
       echo '$var is NULL';
    break;

    case '':
       echo '$var has no value or is emtpy';
    break;
}


1 commentaires

Que faire si je veux faire une condition dans le boîtier du commutateur?