PHP: получение и добавление числовых значений вне цикла - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть проект, над которым я сейчас работаю, с ретранслятором, циклически повторяющим списки треков в альбоме (имена и длины).

Это занимает минуты и секунды (записанные в формате 00: 03: 22 в течение трех минут и двадцати двух секунд, например).

Теперь цель этого проекта состоит в том, чтобы каким-то образом иметь возможность отформатировать эту числовую строку, введенную пользователем, в какую-то переменную, которую PHP распознает как часы: минуты: секунды.

Затем, когда оператор foreach сортирует каждую дорожку альбома (через повторитель), суммирует длину каждой дорожки (в формате ЧЧ: ММ: СС).

Выводит итоговую сумму вотобразить «38 минут» (или что-то в этом роде).

Пример рабочего кода ниже (имейте в виду, что он может быть не очень чистым, и есть большая вероятность, что этот код может быть написан намного короче), но моя большая проблема здесь заключается в получении итоговых треков, суммируемых за пределамицикл foreach и сообщите пользователю, какова длина всего альбома.

Заранее благодарим вас за любую помощь, которую вы можете предоставить.

if( have_rows('tracks') ):
$count = count(get_field('tracks'));
$k = 1;
print $count . ' Total Songs';
$songs = get_field('tracks');
if($songs) {
    $z = '00:00:00'; // Initial Time Setting Var
    foreach($songs as $song)
    {
        $sl = $song['length']; /Song Length
        $minutes = strstr($sl, ':', true); // Extract Minutes Value
        if ( strlen($minutes) <= 2 ) { $minutes = '0' . $minutes; } // Format Minutes Value to Dual Digit If Singular
        $seconds = strstr($sl, ':'); // Extract Seconds Value
        $seconds = str_replace(':', '', $seconds); // Remove : Before Seconds
        $new_display = $minutes . ':' . $seconds; // Re-Format Minutes : Seconds
        $full_display = '00:' . $new_display; // Add Hours : Before New Time Display
        // Get Full Display Back To Seconds
        $time = explode(':', $full_display);
        $formatted_secs = ($time[0]*3600) + ($time[1]*60) + $time[2];
        // Do Some Stuff For Me
        echo '<p>Song'. $k .' = ' . $sl . '</p>';
        echo 'Track Time For Track '. $k .' in minuntes is ' . $full_display . ' and is ' . $formatted_secs . ' seconds';
        //$z = $z+= $full_display;
        $k++; // Count
    }
    echo '<br>Total time is ' . $z; // Not Working Regardless
}

1 Ответ

0 голосов
/ 20 сентября 2018

Когда вы имеете дело с датами и временем, обычно рекомендуется использовать встроенный в PHP класс DateTime.Это также избавляет от необходимости делать все те уродливые манипуляции со строками, которые вы делаете, и значительно упрощает ваш код.

if (have_rows('tracks')) {    
    $count = count(get_field('tracks'));
    print $count . ' Total Songs';
    $songs = get_field('tracks');
    if ($songs) {
        $start = DateTime::createFromFormat('h:i:s', '00:00:00');
        $total_seconds = 0;

        foreach ($songs as $i => $song) {
            $end = DateTime::createFromFormat('h:i:s', $song['length']);
            $length = $start->diff($end);
            $seconds = $end->getTimestamp() - $start->getTimestamp();
            $total_seconds += $seconds;

            echo '<p>Song'. ($i + 1) .' = ' . $song['length'] . '</p>';
            echo 'Track Time For Track '. ($i + 1) .' in minuntes is ' . $length->format('%H:%I:%S') . ' and is ' . $seconds . ' seconds';
        }

        echo '<br>Total time is ' . $total_seconds;
    }
}

В другом примечании всегда используйте описательные имена переменных, если они не являются простыми счетчиками.Использование $z и $k не описывает, что это за переменные, и делает чтение вашего кода очень трудным для других.

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