进行 PHP 切换的最佳方式,每个案例具有多个值?

2022-08-30 08:33:11

你会如何做这个PHP开关语句?

另请注意,这些是小得多的版本,我需要创建的1将添加更多值。

版本 1:

switch ($p) { 
    case 'home': 
    case '': 
        $current_home = 'current';
    break; 

    case 'users.online': 
    case 'users.location': 
    case 'users.featured': 
    case 'users.new': 
    case 'users.browse': 
    case 'users.search': 
    case 'users.staff': 
        $current_users = 'current';
    break;

    case 'forum': 
        $current_forum = 'current';
    break; 
} 

版本 2:

switch ($p) { 
    case 'home': 
        $current_home = 'current';
    break; 

    case 'users.online' || 'users.location' || 'users.featured' || 'users.browse' || 'users.search' || 'users.staff': 
        $current_users = 'current';
    break;

    case 'forum': 
        $current_forum = 'current';
    break; 
} 

更新 - 测试结果

我对10,000次迭代进行了一些速度测试,

时间 1: 0.0199389457703 // If 语句
时间 2: 0.0389049446106 //switch 语句
时间3: 0.106977939606 // 数组


答案 1

对于任何有未知字符串的情况,并且您需要找出它与一堆其他字符串中的哪一个匹配,唯一不会随着添加更多项目而变慢的解决方案是使用数组,但将所有可能的字符串作为键。因此,您的交换机可以替换为以下内容:

// used for $current_home = 'current';
$group1 = array(
        'home'  => True,
        );

// used for $current_users = 'current';
$group2 = array(
        'users.online'      => True,
        'users.location'    => True,
        'users.featured'    => True,
        'users.new'         => True,
        'users.browse'      => True,
        'users.search'      => True,
        'users.staff'       => True,
        );

// used for $current_forum = 'current';
$group3 = array(
        'forum'     => True,
        );

if(isset($group1[$p]))
    $current_home = 'current';
else if(isset($group2[$p]))
    $current_users = 'current';
else if(isset($group3[$p]))
    $current_forum = 'current';
else
    user_error("\$p is invalid", E_USER_ERROR);

这看起来不像 一个 干净,但它是唯一的快速解决方案,不包括编写一个小的函数和类库来保持它的整洁。向数组中添加项仍然非常容易。switch()


答案 2

版本2不起作用!!

case 'users.online' || 'users.location' || ...

与以下内容完全相同:

case True:

并且将为 的任何值选择 ,除非 是空字符串。case$p$p

||在语句中没有任何特殊含义,您不是在比较这些字符串中的每一个,您只是在检查它是否不是 。case$pFalse


推荐