2011-08-08 10 views
2

我跨解析HTTP_ACCEPT_LANGUAGE一個腳本來解析HTTP_ACCEPT_LANGUAGE

陣列 ( [它] => 1 [AR] => 0.8 [JA] => 0.6 [CN] => 0.4 〔脫〕=> 0.2 )

現在,我想使含有這樣的可用的語言的數組:

$ av_lang = array('en','fr','de','it'); (無序數組)

然後,我想遍歷第一個數組,並獲得第二個數組中的第一個鍵。例如,它從第一個數組中取出'en'並檢查是否存在於第二個數組中,如果不存在,則轉到下一個鍵'ar'並檢查它。如果它們都不是,則返回默認語言,如'en'。

最後,我想獲得$ av_lang中的一個可用lang。

謝謝。

回答

6

嘗試這樣:

$lang = array('it' => 1, 'ar' => 0.8, 'ja' => 0.6, 'cn' => 0.4, 'de' => 0.2); 
$preferred = array('en', 'ja'); 

$intersect = array_values(array_intersect(array_keys($lang), $preferred)); 

if (isset($intersect[0])) { 
    echo $intersect[0]; // returns ja 
} 
+0

謝謝,我會嘗試它,回去:) – medk

7

我個人使用是這樣的:

$lang = $_SERVER['HTTP_ACCEPT_LANGUAGE']; 
preg_match_all('/(\W|^)([a-z]{2})([^a-z]|$)/six', $lang, $m, PREG_PATTERN_ORDER); 
$user_langs = $m[2]; 

你所給出的是2個字母的語言的數組,然後你可以通過他們循環,發現你支持的語言,即

$supported_langs = array('en', 'fr', 'de', 'it'); 
$user_lang = 'en'; // Default 
foreach($user_langs AS $tmp){ 
    if(in_array($tmp, $supported_langs)){ 
     $user_lang = $tmp; 
     break; 
    } 
} 

此時$user_lang現在將CONTA在第一個支持的語言從標題(或默認)

+0

檢查IE11和'HTTP_ACCEPT_LANGUAGE'是'德DE'例如,因此該正則表達式失敗。這是一個恥辱,沒有一個標準化的方式,或者至少我沒有意識到這一點。 – NeverEndingQueue