2010-03-16 3 views
4

난이 변경하려면 : 이런 식으로 뭔가에이 PHP 스위치 문을 단순화하는 방법?

// 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 부분을 건너 뛸 수 있도록. 다른 조합을 시도했지만 작동하지 않는 것 같습니다. 어떤 제안?

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를 사용 :

답변

17

이 작업을 수행 할 수

$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

+0

@ janoChen : 그렇게 할 수 있습니다. 그러나'$ _SESSION [ 'lang']'이 설정되어 있지 않거나 유효한 값을 가지고 있지 않은 경우를 취해야합니다. 그렇다면'language/lang..php' 만 얻을 수 있습니다. 그러나'$ _SESSION [ 'lang']'이 항상 존재하고 유효한 값을 가지고 있다는 것을 확신한다면, 그렇게 할 수 있습니다. – Gumbo

2

비록 주사에 대해 안전하지는 않지만. 그러나 코드를 수정하지 않고 새 언어 코드를 추가 할 수 있습니다.

+0

$ _SESSION 변수에 뭔가를 주입하는 것이 어려울 것이라고 생각합니다. 세션 변수는 클라이언트가 결코 액세스하지 않으며 쿠키를 통해 클라이언트에 연결됩니다. 그러나 $ _COOKIE 변수는 HTTP 헤더를 통해 클라이언트에서 쓸 수 있습니다. – joar

2

또는 :


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

이 당신이 코드를 사용 END_LINK하면 관심은 새로운 언어를 추가 할 때마다 편집 할 필요가 없습니다,이와

$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'; 
} 

완벽하게 잘 작동하고 당신이하지 않습니다 보안에 대해 걱정해야합니다.

+0

내가하려는 일을 볼 수는 있지만 코드가 옳다고 생각하지 않습니다. if 문은 if (preg_match (...) && file_exists (...)) {'이어야합니다. 또한'$ lang_file_tmp'의 요점을 보지 못했습니다 –

+0

맞습니다. 변경 사항을 반영하기 위해 내 게시물을 변경했습니다. $ lang_file_tmp 연결 시퀀스를 두 번 이상 입력하지 않아도됩니다. – joar