PHP:在循环外获取和添加数字值

时间:2018-09-20 01:36:58

标签: php time foreach

我在这里正在处理一个项目,其中有一个中继器循环浏览专辑的曲目列表(名称和长度)。

它查看分钟和秒(例如,以00:03:22的格式写了3分钟和22秒)。

现在,该项目的目标是以某种方式能够将用户输入的数字字符串格式化为某种形式的变量,PHP将该变量识别为hours:minutes:seconds。

然后,因为foreach语句(通过转发器)对专辑的每个曲目进行排序(加起来为HH:MM:SS格式)。

它输出一个最终总计以显示“ 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 :(得分:0)

在处理日期和时间时,通常最好使用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不能描述这些变量是什么,并使他人难以阅读代码。