Перевод функции PHP, которая преобразует секунды в читаемую человеком строку - PullRequest
1 голос
/ 03 ноября 2011

На этом сайте Я нашел функцию для преобразования секунд в удобочитаемый формат, например:

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 ]

3 голосов
/ 03 ноября 2011

Вы можете реализовать их любым удобным для вас способом. ИМХО, предпочтительно, что-то не похожее на текущее решение, в котором нет ясности и читабельности (по крайней мере, так выглядит локальный-var-mutation-with-refs-and-variable-ping-pong). мне).

Только одно возможное решение:

$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);

Посмотреть в действии .

0 голосов
/ 03 ноября 2011

Также собирался упомянуть, что некоторые фреймворки имеют классы Inflector, которые будут определять версию слова во множественном числе / единственном числе, однако я не уверен, поддерживают ли они такие языки, как итальянский, но, возможно, стоит взглянуть. Лично я использую CakePHP Inflector, так как это отдельная библиотека, и мне не нужно было вводить какие-либо другие файлы.

Класс CakePHP Inflector http://api.cakephp.org/class/inflector

Doctrine Inflector: http://www.doctrine -project.org / api / common / 2.0 / doctrine / common / util / inflector.html

0 голосов
/ 03 ноября 2011

Вы, вероятно, хотите что-то подобное?

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

Это вернет полный массив, а не ваш первоначальный ... с результатами ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...