2010-03-16 84 views
4

我想改变这一点:弄成这个样子如何简化这个php switch语句?

// 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; 

(我想,如果我做上面的包括-最终输出的事情$lang_file变量变得多余)

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

回答

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自这是默认设置。

+0

@Gumbo优秀的答案。但我有一个问题:是否有任何方式直接包含文件,而不使用$ lang_file变量,如下所示:include_once'languages/lang。'。$ _ SESSION ['lang']。'php; – alexchenco 2010-03-16 16:18:45

+0

@janoChen:可以这样做。但是您应该考虑'$ _SESSION ['lang']'未设置或不包含有效值的情况。然后你会得到'languages/lang..php'。但是如果你确保'$ _SESSION ['lang']'总是存在并且有一个有效值,那么你确实可以这样做。 – Gumbo 2010-03-16 16:22:35

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

虽然它是不安全的注射。但是,它确实允许您在不修改代码的情况下添加新的语言代码。

+0

我认为这将是很难注入$ _SESSION变量的东西。会话变量永远不会被客户端访问,它只是通过cookie连接到客户端。但是,$ _COOKIE变量可由客户端通过HTTP头进行写入。 – joar 2010-03-16 16:28:36

2

或者:


$allowed = array('en', 'es', 'zh-tw', 'zh-cn'); 
$lang_file = (in_array($_SESSION['lang'], $allowed)) 
      ? 'lang.'.$_SESSION['lang'].'.php' : 'lang.en.php'; 
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'; 
} 

有了这个,你就不必每次your're添加新语言时编辑代码,你不会不得不担心安全。

+0

我可以看到你想要做什么,但我不认为你的代码是正确的。你的if语句应该是'if(preg_match(...)&& file_exists(...)){'。此外,我没有看到'$ lang_file_tmp'的要点 – 2010-03-16 18:25:48

+0

您是对的,我已更改我的帖子以反映您的更改。 $ lang_file_tmp 是否需要不止一次地键入连接序列。 – joar 2010-03-17 10:59:05