Php 空字符串的开关大小写条件
我无法解释这一点Php 空字符串的开关大小写条件,php,Php,我无法解释这一点 public static function getIconBaseOnOS($os) { switch ($os) { case (strpos($os, 'Win64') !== false): $icon = 'windows'; break; case (strpos($os, 'WOW64') !== false): $icon = 'windows'; b
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;
}
前两排
我的操作系统显然==空&&length==0
我不知道为什么这个案例不是触发器
$icon='na'代码>,但它却一直显示windows
图标 我发现了自己的错误
而不是
开关($os){
我应该这样做
开关(真){
它现在工作得很好
开关箱不是这样工作的
如Deceze在评论中所述,“switch($os)case(strpos($os,'Win64')!==false)
相当于if($os==(strpos($os,'Win64')!==false))
”
例如,如果输入是'iPhone'
,在switch/case中,第一个非false条件是:case(strpos($os,'iPhone')!==false):
一步一步地执行,您会得到:
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)
现在,假设您传递了一个空字符串
strpos('', 'Win64'); // false
false !== false // false
'' == false // true ! an empty string is considered as a falsy value.
我建议去掉开关盒,改用数组,比如
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';
}
我希望这将是一个优化的方式来做这件事,因为你喜欢,但有太多更好的方式来做同样的事情
// 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;
//如果为空字符串,则返回所需内容
if(strlen($os)Switch语句只比较传递给它的变量的值
$var = null;
switch($var)
{
case null:
echo '$var is NULL';
break;
case '':
echo '$var has no value or is emtpy';
break;
}
switch($os)case(strpos($os,'Win64')!==false)
相当于if($os==(strpos($os,'Win64')!==false))
。在这里使用开关毫无意义。我不明白你的意思。是我的条件不对吗?我按照PHP文档检查字符串是否包含。我正在键入一个答案,希望它能有所帮助。这是不同的,你正在将$os
与的结果进行比较(strpos($os,'Win64')!==false)
数组的想法非常好。更好的是,将$osArray作为参数传递给函数。+1来自我。谢谢你,Cid,我非常喜欢你的想法。调整了我的代码;)如果我想在开关情况下执行条件,该怎么办?