如何简化这个php switch语句?

时间:2010-03-16 16:02:34

标签: php switch-statement

我想改变这个:

// use appropiate lang.xx.php file according to the value of the $lang
switch ($_SESSION['lang']) {
case 'en':
 $lang_file = 'lang.en.php';
 break;

case 'es':
 $lang_file = 'lang.es.php';
 break;

case 'zh-tw':
 $lang_file = 'lang.zh-tw.php';
 break;

case 'zh-cn':
 $lang_file = 'lang.zh-cn.php';
 break;

default:
 $lang_file = 'lang.en.php';
}

这样的事情:

//include file for final output
 include_once 'languages/lang.'.$_SESSION['lang'].'php;

(如果我执行上面的include-final-output-thing,我认为$lang_file变量会变得多余)

这样我就可以跳过整个switch部分。我尝试过其他组合,但它们似乎不起作用。有什么建议吗?

4 个答案:

答案 0 :(得分:17)

你可以这样做:

switch ($_SESSION['lang']) {
case 'en':
case 'es':
case 'zh-tw':
case 'zh-cn':
    $lang_file = 'lang.'.$_SESSION['lang'].'.php';
    break;

default:
    $lang_file = 'lang.en.php';
}

或者您使用数组并使用in_array查看值是否在数组中:

$languages = array('en', 'es', 'zh-tw', 'zh-cn');
if (in_array($_SESSION['lang'], $languages)) {
    $lang_file = 'lang.'.$_SESSION['lang'].'.php';
} else {
    $lang_file = 'lang.en.php';
}

你甚至可以在两种情况下省略en,因为它是默认值。

答案 1 :(得分:2)

$lang_file = 'lang.' . ($_SESSION['lang']) . 'php';
if(!file_exists($lang_file))
{
    $lang_file = 'lang.en.php';
}

虽然不能防止注射。但是,它允许您在不修改代码的情况下添加新的语言代码。

答案 2 :(得分:2)

或者:


$allowed   = array('en', 'es', 'zh-tw', 'zh-cn');
$lang_file = (in_array($_SESSION['lang'], $allowed))
           ? 'lang.'.$_SESSION['lang'].'.php' : 'lang.en.php';

答案 3 :(得分:0)

这将完美无缺

$lang_file_tmp = 'lang.' . $_SESSION['lang'] . '.php';
if ( preg_match( '/^[a-zA-Z\-]{2,5}$/', $_SERSSION['lang'] ) && file_exists( $lang_file_tmp ) ) { 
    $lang_file = $lang_file_tmp;
} else {
    $lang_file = 'lang.en.php';
}

通过这种方式,您无需在每次添加新语言时编辑代码,也无需担心安全问题。