2010-03-16 115 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