2011-11-02 49 views
1

In this website一个PHP函数,我发现一个函数转换秒的人类可读的格式,例如:翻译是转换秒的人类可读的字符串

3周,2天,1小时27分,52秒

我想翻译它的意大利语,所以我刚刚翻译了数组键。作用就是现在这个

function secondsToHumanReadable($secs) { 

$units = array(
'settimane' => 604800, 
'giorni' => 86400, 
'ore'  => 3600, 
'minuti' =>  60, 
'secondi' =>  1 
); 

foreach ($units as &$unit) { 
    $quot = intval($secs/$unit); 
    $secs -= $quot * $unit; 
    $unit = $quot; 
} 

return $units; 
} 

它工作得很好,但有一个小问题:在英语中所有的复数用一个字母较少的结束,但不幸的是在意大利它是不一样的,因为你可以看到下面。

English    Italian  
- weeks, week  - settimane, settimana 
- days, day   - giorni, giorno 
- hours, hour  - ore, ora 
- minutes, minute - minuti, minuto 
- seconds, second - secondi, secondo 

我想找到一个解决打印奇异键,当值== 1

我在想,我可以在阵列与另一个阵列有奇异键,使用array_combine()合并。

$singular_units = array(
'settimana', 
'giorno', 
'ora', 
'minuto', 
'secondo' 
); 

print_r(array_combine($singular_units, $units)); 

/* print_r: 
Array 
(
    [settimana] => 604800 
    [giorno] => 86400 
    [ora] => 3600 
    [minuto] => 60 
    [secondo] => 1 
) 
*/ 

上面的阵列是我需要的,但我不能够使用它,因为我只是不能使用其他foreach

$seconds = 12345*60; // just an example 
$units = secondsToHumanReadable($seconds);    
$time_string = ''; 
foreach ($units as $u => $v) 
    if (!empty($v)) 
     $time_string.= $v.' '.$u.', '; 
echo substr($time_string, 0, -2); 
// 1 settimane, 1 giorni, 13 ore, 45 minuti 
// this echo is not correct :(is expected to be like this: 
// 1 settimana, 1 giorno, 13 ore, 45 minuti 

我该如何实现单数的单词?

任何帮助是真的赞赏!提前感谢你!

回答

3

你可以以任何你喜欢的方式来实现它们,恕我直言,最好不像目前的解决方案,缺乏清晰度和可读性(至少这是如何local-var-mutation-with-refs-and-variable-ping-pong look喜欢我)。

只是一个可能的解决方案:

$input = 12345 * 60; 

$units = array(
    604800 => array('settimana', 'settimane'), 
    86400 => array('giorno', 'giorni'), 
    // etc 
); 

$result = array(); 
foreach($units as $divisor => $unitName) { 
    $units = intval($input/$divisor); 
    if ($units) { 
     $input %= $divisor; 
     $name = $units == 1 ? $unitName[0] : $unitName[1]; 
     $result[] = "$units $name"; 
    } 
} 

echo implode(', ', $result); 

See it in action

+0

真棒!谢谢! – Simone

0

你可能想要这样的东西?

function secondsToHumanReadable($secs) { 

    $units = array(
    'settimane' => 604800, 
    'giorni' => 86400, 
    'ore'  => 3600, 
    'minuti' =>  60, 
    'secondi' =>  1 
    ); 

    foreach ($units as $key => &$unit) { 

     $this_unit = intval($secs/$unit); 

     $secs -= $this_unit * $unit; 

     if($this_unit == 1):  
      switch($key): 
       case "settimane": 
        $this_key = "settimana"; 
       break; 
       case "giorni": 
        $this_key = "giorno"; 
       break; 
       case "ore": 
        $this_key = "ora"; 
       break; 
       case "minuti": 
        $this_key = "minuto"; 
       break; 
       case "secondi": 
        $this_key = "secondo"; 
       break; 
      endswitch; 
     else: 
      $this_key = $key; 
     endif; 


     $results[$this_key] = $this_unit; 
    } 

    return $results; 
} 

这将返回全阵列,而不是你最初的一...与结果...

0

也是要提到的一些框架有变形器类,这将决定的复数/奇异版本一个字,但是我不确定他们是否支持意大利语等语言,但可能值得一看。我个人使用CakePHP Inflector,因为它是一个独立的lib,我不需要带任何其他文件。

CakePHP的变形器类 http://api.cakephp.org/class/inflector

主义变形器:http://www.doctrine-project.org/api/common/2.0/doctrine/common/util/inflector.html

+0

看起来非常有趣:)但不幸的是只适用于英语 – Simone

相关问题