Php switch语句 - 如何管理重复的案例?

时间:2017-06-21 17:56:46

标签: php switch-statement

我正在建立一个网站,用户应该可以从三个区域中选择内容应该是可见的。我有以下几个区域:

  • 1区:阿根廷,乌拉圭,巴拉圭,智利,委内瑞拉,秘鲁
  • 地区2:墨西哥,哥伦比亚,厄瓜多尔,巴西,伯利兹,哥斯达黎加,El 萨尔瓦多,危地马拉,洪都拉斯,尼加拉瓜,巴拿马
  • 区域0:应包括上述所有国家/地区

我有以下开关声明:

switch ( $countryCode ) {
    case 'AR':
    case 'UY':
    case 'PY':
    case 'CL':
    case 'VE':
    case 'PR':
        // code to execute
        break;

    case 'MX':
    case 'CO':
    case 'EC':
    case 'BR':
    case 'BZ':
    case 'CR':
    case 'SV':
    case 'GT':
    case 'HN':
    case 'NI':
    case 'PA':
        // code to execute
        break;

    case 'AR':
    case 'UY':
    case 'PY':
    case 'CL':
    case 'VE':
    case 'PR':
    case 'MX':
    case 'CO':
    case 'EC':
    case 'BR':
    case 'BZ':
    case 'CR':
    case 'SV':
    case 'GT':
    case 'HN':
    case 'NI':
    case 'PA':
        // code to execute
        break;

    default:
        // code to execute
        break;
}

我的交换机代码结构有问题,我必须包含所有国家/地区(地区0)。我似乎无法重复在之前的案例陈述中宣布的国家(我知道这很明显),但我无法找到正确的方法。

有没有办法重构我的代码,所以会有一个包含所有国家/地区的案例陈述?如果使用开关无法做到这一点,你们还有其他建议吗?

谢谢!

3 个答案:

答案 0 :(得分:0)

选项A)硬编码你的场景(坏主意)

function get_region($country_code){

    switch ( $country_code ) {
        case 'AR':
        case 'UY':
        case 'PY':
        case 'CL':
        case 'VE':
        case 'PR':
            return 1;
            break;

        case 'MX':
        case 'CO':
        case 'EC':
        case 'BR':
        case 'BZ':
        case 'CR':
        case 'SV':
        case 'GT':
        case 'HN':
        case 'NI':
        case 'PA':
            return 2;
            break;

        default:
            return 0;
            break;
    }
}

echo get_region("AR")."\n";
echo get_region("MX")."\n";

选项B)使用外部.ini文件

regions.ini

; region 1
[1]
country[] = "AR"
country[] = "UY"
country[] = "PY"
country[] = "CL"
country[] = "VE"
country[] = "PE"

; region 2
[2]
country[] = "MX"
country[] = "CO"
country[] = "EC"
country[] = "BR"
country[] = "BZ"
country[] = "CR"
country[] = "SV"
country[] = "GT"
country[] = "HN"
country[] = "NI"
country[] = "PA"

function.php:

function get_region($country_code){

    $region = parse_ini_file("regions.ini", true);

    if (in_array($country_code,$region[1]['country'], false)){
        return 1;
    } elseif (in_array($country_code,$region[2]['country'], false)){
        return 2;
    } else {
        return 0;
    }
}

echo get_region("AR")."\n";
echo get_region("MX")."\n";

答案 1 :(得分:0)

正如@KenWhite所提到的那样,逐个区域,然后检查区域。

您的代码可能如下所示:

<?php

$regions = [false, false, false];

switch ( $countryCode ) {
    case 'AR':
    case 'UY':
    case 'PY':
    case 'CL':
    case 'VE':
    case 'PR':
        $regions[0] = $regions[1] = true;
        break;

    case 'MX':
    case 'CO':
    case 'EC':
    case 'BR':
    case 'BZ':
    case 'CR':
    case 'SV':
    case 'GT':
    case 'HN':
    case 'NI':
    case 'PA':
        $regions[0] = $regions[2] = true;
        break;

    default:
        break;
}

if($regions[0]) {
    //some code here
}
// etc.

答案 2 :(得分:0)

如果我理解这个问题,你有两个互斥的代码路径和一个包含的代码路径。我将不再使用switch并使用集合(即PHP数组)。

$region1 = array_combine(['AR','UY','PY','CL','VE','PR'],true);
$region2 = array_combine(['MX','CO','EC','BR','BZ','CR','SV',
                          'GT','HN','NI','PA',],true);

if (isset($region1[$countryCode])) {
    // Region 1 specific...

}
else if (isset($region2[$countryCode])) {
    // Region 2 specific...

}

if (isset($region1[$countryCode],$region2[$countryCode])) {
    // Region 0 specific...

}
else {
    // Default case...

}

更好(如果可能的话)将代码路径移动到它们自己的函数:

function region1() { }
function region2() { }
function region0() { }

$region1 = array_combine(['AR','UY','PY','CL','VE','PR'],true);
$region2 = array_combine(['MX','CO','EC','BR','BZ','CR','SV',
                          'GT','HN','NI','PA',],true);

if (isset($region1[$countryCode])) {
    region1();
    region0();
}
else if (isset($region2[$countryCode])) {
    region2();
    region0();
}
else {
    // Default case...

}