开发者

Is there a better way to loop two associative arrays to match their values?

开发者 https://www.devze.com 2023-03-26 00:03 出处:网络
I\'m parsing the HTTP_ACCEPT_LANGUAGE header to get users\' language and I\'m building a class to do that.

I'm parsing the HTTP_ACCEPT_LANGUAGE header to get users' language and I'm building a class to do that.

Actually I build an associative array ("$this->user_lang") where keys are the language (such as "en-us", "it-it", "it-ch" etc) and the value is the quality factor (so I can order languages). Then I have another associative array named "$this->installed_langs" where I declare supported language and locales (in the form "en" => "en_US", "it" => "it_IT").

All I want to do is try to match one of the key of "$this->user_lang" with one of the "$this->installed_langs" (without care of the local zone after the "-") and return the first occurrence (with no care for other matching case).

I ended up with this method but it seems a bit too complex...

public function show() {
    $g_locale = null;
    foreach ($th开发者_如何转开发is->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;
}

I hope I have explained it well, btw if you need more informations, please, ask me.


Try this

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];
        }
    }
}


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

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号