如何更改数组 PHP OOP 中的序列
Posted
技术标签:
【中文标题】如何更改数组 PHP OOP 中的序列【英文标题】:How to change sequence in array PHP OOP 【发布时间】:2014-02-25 07:42:46 【问题描述】:我需要你的帮助,我尝试在 oop php 中编写脚本来更改和设置当前语言。此刻,我有一部分用于更改 lang 并让您的 IP 检查您的位置。现在我需要一个部件来设置当前的语言,这是我的噩梦。这是我在 OOP 中的第一步,我不知道我该怎么做。 这是我的脚本:
<?php
class IP
static $fields = 24578; //65535; // refer to http://ip-api.com/docs/api:returned_values#field_generator
static $use_xcache = false; // set this to false unless you have XCache installed (http://xcache.lighttpd.net/)
static $api = "http://ip-api.com/php/";
public $status, $country, $countryCode, $region, $regionName, $city, $zip, $lat, $lon, $timezone, $isp, $org, $as, $reverse, $query, $message;
public static function query($q)
$data = self::communicate($q);
$result = new self;
foreach($data as $key => $val)
$result->$key = $val;
return $result;
private static function communicate($q)
$q_hash = md5('ipapi'.$q);
if(self::$use_xcache && xcache_isset($q_hash))
return xcache_get($q_hash);
if(is_callable('curl_init'))
$c = curl_init();
curl_setopt($c, CURLOPT_URL, self::$api.$q.'?fields='.self::$fields);
curl_setopt($c, CURLOPT_HEADER, false);
curl_setopt($c, CURLOPT_TIMEOUT, 30);
curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
$result_array = unserialize(curl_exec($c));
curl_close($c);
else
$result_array = unserialize(file_get_contents(self::$api.$q.'?fields='.self::$fields));
if(self::$use_xcache)
xcache_set($q_hash, $result_array, 86400);
return $result_array;
public $client_ip;
public function getIP()
return "173.194.78.94";
/*
if (getenv("HTTP_CLIENT_IP")) $this->client_ip = getenv("HTTP_CLIENT_IP");
else if(getenv("HTTP_X_FORWARDED_FOR")) $this->client_ip = getenv("HTTP_X_FORWARDED_FOR");
else if(getenv("REMOTE_ADDR")) $this->client_ip = getenv("REMOTE_ADDR");
else $this->ip = "UNKNOWN";
return $this->client_ip;
*/
class Lang
private $languages = array('pl' => 'Polish', 'en' => 'English', 'ru' => 'Russian');
public function showIP()
$query = IP::query('');
echo 'Country code: '.$query->countryCode.' your ip: '.$query->query;
if($query->countryCode == 'PL')
$this->languages = array('pl' => 'Polish', 'en' => 'English', 'ru' => 'Russian');
return $this->languages;
elseif($query->countryCode == 'RU' || $query->countryCode == 'BY' || $query->countryCode == 'KZ' || $query->countryCode == 'KG')
$this->languages = array('ru' => 'Russian', 'en' => 'English', 'pl' => 'Polish');
return $this->languages;
else
$this->languages = array('en' => 'English', 'ru' => 'Russian', 'pl' => 'Polish');
return $this->languages;
private $current_language = false;
private $lines = array();
private static $instance = false;
public function __construct()
$this->set_language();
public static function instance()
if(self::$instance == FALSE)self::$instance = new Lang;
return self::$instance;
private function set_language()
if(isset($_GET['lang']) AND array_key_exists(($lang = strtolower($_GET['lang'])), $this->languages))
$this->current_language = $lang;
else
$this->current_language = $this->default_language();
$this->load_lang_file();
private function load_lang_file()
if(file_exists('langs/'.$this->current_language.'.php'))
include 'langs/'.$this->current_language.'.php';
$this->lines = $lang;
private function default_language()
return current(array_keys($this->languages));
public static function line($name = FALSE, $params = array())
if(isset(self::instance()->lines[$name]))
return vsprintf(self::instance()->lines[$name], $params);
return FALSE;
public static function get_language()
return self::instance()->current_language;
public static function get_languages()
return self::instance()->languages;
function __($name = FALSE, $params = array())
return Lang::line($name, $params);
?>
这部分有问题:
private $languages = array('pl' => 'Polish', 'en' => 'English', 'ru' => 'Russian');
public function showIP()
$query = IP::query('');
echo 'Country code: '.$query->countryCode.' your ip: '.$query->query;
if($query->countryCode == 'PL')
$this->languages = array('pl' => 'Polish', 'en' => 'English', 'ru' => 'Russian');
return $this->languages;
elseif($query->countryCode == 'RU' || $query->countryCode == 'BY' || $query->countryCode == 'KZ' || $query->countryCode == 'KG')
$this->languages = array('ru' => 'Russian', 'en' => 'English', 'pl' => 'Polish');
return $this->languages;
else
$this->languages = array('en' => 'English', 'ru' => 'Russian', 'pl' => 'Polish');
return $this->languages;
我尝试更改数组中的键,例如现在这样工作:如果数组中的第一个元素是英语,那么您当前的语言是英语,如果第一个元素是波兰语,那么您在本网站中的当前语言是波兰语。我尝试更改它并添加地理定位,但我不知道如何更改数组中的序列或者可能是一种更简单的方法。
【问题讨论】:
相关:***.com/a/2316375/476 好吧,购买 3 个域(例如 com pl 和 ru)并准备三种语言的网站会更好吗?也许这是解决方案,但哪个版本对 seo 友好 这是一个不同的主题,取决于许多因素。如果您像 Facebook 一样,URL 几乎无关紧要,而且都是用户设置,那么不通过 URL 区分语言是完全可行的。否则example.com/en
、example.com/ru
等也是可能的。如果您真的想吸引某个市场并且显得“本地”很重要,那么不同的***域名特别有用。这完全独立于基于 IP 检测语言的问题。
【参考方案1】:
如果您只想“重新排序”数组中的键 - 我相信这是您的实际问题,那么您必须从数组中提取所需的键并使用 array_unshift 将其重新添加到列表的开头.您不能以任何经典方式对它们进行“排序”,因为您正在寻找一个非常具体的顺序,而不是标准的字母(或其他可排序)方法。您正在优先考虑关联的键。
最简单的方法是:
$lang = array('pl' => 'Polish', 'en' => 'English', 'ru' => 'Russian');
$selectedLang = $lang['en'];
unset($lang['en']);
array_unshift($lang,$selectedLang);
var_dump($lang);
如果您想将其应用于您的代码示例(我会将 if 更改为开关):
$this->languages = array('pl' => 'Polish', 'en' => 'English', 'ru' => 'Russian');
switch($query->countryCode)
case 'PL':
$selectedLang = $this->languages['pl'];
unset($this->languages['pl']);
array_unshift($this->languages,$selectedLang);
return $this->languages;
break;
case 'RU':
$selectedLang = $this->languages['ru'];
unset($this->languages['ru']);
array_unshift($this->languages,$selectedLang);
return $this->languages;
break;
default:
$selectedLang = $this->languages['en'];
unset($this->languages['en']);
array_unshift($this->languages,$selectedLang);
return $this->languages;
break;
更好的是重构函数中的代码并使用您的 countrycode 变量作为参数
function selectLang($langstring,$lang)
$selectedLang = $lang[$langstring];
unset($lang[$langstring]);
array_unshift($lang,$selectedLang);
return $lang;
$this->languages = array('pl' => 'Polish', 'en' => 'English', 'ru' => 'Russian');
return selectLang( strtolower ($query->countryCode), $this->languages),
希望对你有帮助
【讨论】:
以上是关于如何更改数组 PHP OOP 中的序列的主要内容,如果未能解决你的问题,请参考以下文章