2011-08-04 1 views
0

私はHTTP_ACCEPT_LANGUAGEヘッダーを解析してユーザーの言語を取得しており、そのためのクラスを作成しています。2つの連想配列をループしてその値に一致させるより良い方法はありますか?

実際には、キーが言語(「en-us」、「it-it」、「it-ch」など)である連想配列(「$ this-> user_lang」)を作成します。品質係数(だから私は言語を注文することができます)。 次に、 "$ this-> installed_langs"という別の連想配列をサポートする言語とロケールを宣言します( "en" => "en_US"、 "it" => "it_IT"の形式)。

"$ this-> installed_langs"( " - "の後にローカルゾーンを気にせず)のいずれかと "$ this-> user_lang"のキーの1つを一致させようとするだけです。最初のオカレンスを返します(他のマッチングの場合は気にしないでください)。

私はあなたがより多くの情報を必要とするところで場合は、私に聞いてください、それをうまく説明している願っています

public function show() { 
    $g_locale = null; 
    foreach ($this->user_lang as $lang => $q) { 
     foreach($this->installed_langs as $valid => $locale) { 
      if (strpos($lang, $valid) !== false) { 
       if ($g_locale === null) $g_locale = $locale; 
      } 
     } 
    } 
    // debug: 
    echo $g_locale; 
} 

...私はこの方法で終わったが、それは少し複雑すぎるようです。

+1

を試してみてください? – Calum

+0

私は見つかった各言語のネストされたforeachループを避けたいので...それはヘッダーで送られるブラウザで宣言された言語の数によって異なります。 –

答えて

0
function show() { 
    $g_locale = null; 
    foreach ($this->user_lang as $lang => $q) { 
     $_key=explode($lang, '-'); // 'en-us' => 'array('en', 'us') 
     $key=$_key[0]; // 'en' 
     if (array_key_exists($key, $this->installed_langs)) { 
      $g_locale = $this->installed_langs[$key]; 
     } 
    } 
} 
+0

ええ、それは私が探していたものです。ありがとう! –

1

はかなりコンパクトなようで、それが動作するかどうか、なぜ代替を探し、この

public function show() { 
    $g_locale = null; 
    foreach ($this->user_lang as $lang => $q) { 
     if (array_key_exists($lang, $this->installed_langs)) { 
      $g_locale = $this->installed_langs[$lang]; 
     } 
    } 
} 
+0

これはローカルゾーンを除外しませんが、私は必要ですが、提案に感謝します。 –