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,我非常喜欢你的想法。调整了我的代码;)如果我想在开关情况下执行条件,该怎么办?