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;
}
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?
4 Réponses :
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)
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;)
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;
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;
}
Que faire si je veux faire une condition dans le boîtier du commutateur?
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-elsealors 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
$osavec le résultat de(strpos($os, 'Win64') !== false)switchest un raccourci si les valeurs comparées sont des valeurs constantes.switch ($foo) case 'bar':Vous n'avez pas ça. Vous avez des conditionsif..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
breaksupplémentaire pour chaque cas, puisque vous n'êtes même pas intéressé par le comportement de chute duswitch?