如何更改数组 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/enexample.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 中的序列的主要内容,如果未能解决你的问题,请参考以下文章

如何在php上更改数组中的键?

如何更改静态链接库中 const 字符串数组的 Visual Studio C++ 初始化序列

如何使用php而不是OOP自动包含文件?

PHP如何将数据附加到序列化数组中

PHP 中的 OOP 方法

php如何序列化对象数组?