2013-06-11 26 views
1

我一直在做一些研究,爲用戶提供一個可用的時區選擇框,但到目前爲止我對結果並不滿意。 我使用PHP的內置DateTime和DateTimeZone來獲取時區列表(Olson數據庫)。但是,如果你曾經使用過這個,你會發現它是一個很長的列表(約300個項目),因此在選擇框中不可用。我使用optgroups對它進行了格式化,以便按區域對它進行分組,並使用相同的UTC偏移量連接城市。名單還很長,我對此並不滿意。我實際上只想得到世界各個地區的主要城市,而不是相對未知的城市,如果這是有道理的話。PHP時區選擇

我想保持標識符的樣子,因爲我可以使用DateTime和DateTimeZone類來執行轉換和東西。任何想法如何使這個列表更有用/更短?

我現在所擁有的代碼如下(有點凌亂,但現在它的工作正在進行中):

public function getListOfTimezones() 
    { 
     $options = array(); 
     $utc = new DateTimeZone('UTC'); 

     //$regions = array('Africa', 'America', 'Antarctica', 'Arctic', 'Asia', 'Atlantic', 'Australia', 'Europe', 'Indian', 'Pacific'); 
     $regions = array('America', 'Asia', 'Atlantic', 'Australia', 'Europe', 'Pacific'); 
     $tzs = DateTimeZone::listIdentifiers(); 
     $optgroup = null; 
     $timezoneGroup = array(); 
     sort($tzs); 

     foreach ($tzs as $tz) 
     { 
      $timezonepieces = explode('/', $tz, 2); 

      if (count($timezonepieces) != 2 || !in_array($timezonepieces[0], $regions)) continue; 

      $region = $timezonepieces[0]; 
      $location = $timezonepieces[1];    

      if (count($timezoneGroup) > 0) 
      { 
       $lastTimeZone = $timezoneGroup[count($timezoneGroup) - 1]; 

       $utcTime = new DateTime(null, $utc); 
       $timezoneInfo = new DateTimeZone($tz); 
       $lastTimeZoneInfo = new DateTimeZone($lastTimeZone['timezoneid']); 

       if ($timezoneInfo->getOffset($utcTime) == $lastTimeZoneInfo->getOffset($utcTime)) 
       { 
        $addTz = array('timezoneid' => $tz, 'timezonelabel' => str_replace('_', ' ', $location)); 
        $timezoneGroup[] = $addTz; 
       } 
       else 
       { 
        $labels = array(); 

        if (count($timezoneGroup) > 5) 
        { 
         $timezoneGroup = array_slice($timezoneGroup, 0, 5); 
        } 

        $country = ''; 
        foreach ($timezoneGroup as $curTimezone) 
        { 
         $pieces = explode('/', $curTimezone['timezonelabel'], 2); 

         if (count($pieces) == 2) 
         { 
          if ($pieces[0] == $country) 
          { 
           continue; 
          } 
          else 
          { 
           $country = $pieces[0]; 
          } 
         } 

         $labels[] = $curTimezone['timezonelabel']; 
        } 
        $optgroup['options'][htmlentities($timezoneGroup[0]['timezoneid'])] = implode(', ', $labels); 

        // New timezone group 
        $timezoneGroup = array(); 
        $addTz = array('timezoneid' => $tz, 'timezonelabel' => str_replace('_', ' ', $location)); 
        $timezoneGroup[] = $addTz; 
       } 
      } 
      else 
      { 
       $addTz = array('timezoneid' => $tz, 'timezonelabel' => str_replace('_', ' ', $location)); 
       $timezoneGroup[] = $addTz; 
      } 

      if (!$optgroup || (is_array($optgroup) && array_key_exists('label', $optgroup) && $optgroup['label'] != htmlentities($region))) 
      { 
       if ($optgroup) 
       { 
        // End of previous optgroup, start of new one 
        $options[] = $optgroup; 
       } 

       $optgroup = array('label' => htmlentities($region), 'options' => array()); 
      } 
     } 

     if (is_array($optgroup)) 
     { 
      $options[] = $optgroup; 
     } 

     return $options; 
    } 
+2

使用JS來實現查找,當你鍵入?例如,['Select2'](http://ivaynberg.github.io/select2/)。 – Jon

+0

這是一個相當不錯的組件。我會研究它,看看我能否把它扔進去。謝謝! – Ruben

+0

好吧,我實現了Select2選擇框,這對於普通用戶來說非常簡單。非常感謝喬恩。既然你用評論回答我不能給你分。如果你把它寫在答案中,我會接受它作爲答案。 – Ruben

回答

2

是有限制的,當有需要,你可以用純HTML做什麼專門的數據輸入就像這裏一樣。

我推薦使用一些增強時區選擇的JavaScript組件;例如一個非常好的jQuery插件,我也使用的是Select2。它可以在您輸入時自動查找並轉換一個下拉菜單以及許多附加功能。