【问题标题】:Combine parts of an Array of Days组合天数的一部分
【发布时间】:2013-03-15 08:47:52
【问题描述】:

我有一项艰巨的任务是显示各个地方的小时数。我想结合时间从一个晚上开始到第二天早上结束的实例。任何人都知道我可以如何修改下面的脚本以使其正常工作?

我有一个如下所示的 MySQL 表:

我当前的 PHP 脚本从表格中输出日期和时间,如下所示:

周一至周四:晚上 11:00 至晚上 11:59

周一至周四:凌晨 12:00 至凌晨 2:00

我希望它看起来像这样:

周一至周四:晚上 11:00 至凌晨 2:00

这是我当前的 PHP 脚本:

<?php

//connection

$day_times = array();
$days_map = array(
     'monday'     => 'Mon',
     'tuesday'    => 'Tue',
     'wednesday'  => 'Wed',
     'thursday'   => 'Thu',
     'friday'     => 'Fri',
     'saturday'   => 'Sat',
     'sunday'     => 'Sun'
);

$query = mysql_query("SELECT distinct time_group_id, start_time, end_time 
FROM times WHERE place_id = '80' ORDER BY id ASC");

while ($row=mysql_fetch_assoc($query)) {
    $start_time = stripslashes($row['start_time']);
    $end_time = stripslashes($row['end_time']);

    $start_time = strtotime("$start_time");
    $end_time = strtotime("$end_time");

    $day = strtolower($row['day']);

    $day_times[$row['time_group_id']][$day][] = $start_time;
    $day_times[$row['time_group_id']][$day][] = $end_time;


// within your query while loop
$day_times[$row['time_group_id']]['times'][] = $start_time;
$day_times[$row['time_group_id']]['times'][] = $end_time;
$day_times[$row['time_group_id']]['days'][]  = $day;

foreach ($day_times as $timegroup) {
    $first_day = array_shift($timegroup['days']);
    $last_day = array_pop($timegroup['days']);
    $times = $timegroup['times'];

    echo $days_map[$first_day] . ' - ' . $days_map[$last_day] . ': ';
    echo date('g:ia', min($times));
    echo ' to ';
    echo date('g:ia', max($times));     
    echo '<br />';
} 

}

?>

目前得到这样的输出:

周一至周六:下午 4:00 至晚上 7:00

周一至周四:晚上 11:00 至晚上 11:59

周一至周四:凌晨 12:00 至凌晨 2:00

【问题讨论】:

  • 是否有任何规定,或者您只是在寻找最大和最小日期时间?目前它们不是连续的。 23:00:00 到 23:59:00 然后跳到 00:00:00 并转到 02:00:00。最大值和最小值相当简单,但如果有需要排除的时间,那就有点乏味了。
  • 没有必要从 23:59:00 跳到 24:00:00。我宁愿它是连续的,但没有这样设置。有没有更好的方法来设置它以使其连续?
  • 正则表达式不是你的朋友。尽可能避免使用它们。
  • 你怎么知道时间会继续?他们是否应该有一个匹配的时间组 ID,或者您只是在寻找一个在午夜没有间隙并且接下来的日子?时间会超过几天(即,您可以选择星期一 23:00 - 23:59,然后是星期二 00:00 - 23:59,然后是星期三 00:00 - 02:00)吗?
  • 嗨@Kickstart,如果某个时间在一天的 23:59 结束并在第二天的 00:00 开始,则时间将一直持续下去。他们不会持续几天。他们不需要有匹配的组 ID。

标签: php mysql arrays foreach


【解决方案1】:

编辑:
我认为如果不重写表格以使您能够将结果分组在一起,就无法在代码中解决这个问题。目前您只有 time_group_id 作为某种分隔符。第一段和第二段代码将以这种方式对结果进行分组,但最后一段根本没有对它们进行分组。找到一个规则,您可以在表格中拆分结果,然后根据需要轻松显示它们。

第一:

1) 停止使用 mysql_ 内置函数,它们将从较新版本的 PHP 中删除。

试试这样的脏程序代码:

$day_times = array();
$days_map = array(
     'monday'     => 'Mon',
     'tuesday'    => 'Tue',
     'wednesday'  => 'Wed',
     'thursday'   => 'Thu',
     'friday'     => 'Fri',
     'saturday'   => 'Sat',
     'sunday'     => 'Sun'
);

$query = mysql_query("SELECT distinct time_group_id, start_time, end_time 
FROM times WHERE place_id = '80' ORDER BY id ASC");

while ($row=mysql_fetch_assoc($query)) {
    $start_time = stripslashes($row['start_time']);
    $end_time = stripslashes($row['end_time']);

    $start_time = strtotime("$start_time");
    $end_time = strtotime("$end_time");

    $day = strtolower($row['day']);

    $day_times[$row['time_group_id']][$day][] = $start_time;
    $day_times[$row['time_group_id']][$day][] = $end_time;
}

这应该给你一个数组:

[time_group_id] => Array(
                      'monday' => Array(
                           '1123323444',
                           '4443543644',
                           '1123323444',
                           '2332133242',
                           '9782122333',
                           '3246556444'
                       ),
                       'tuesday' => Array(
                           '1123323444',
                           '4443543644',
                           '1123323444',
                           '2332133242',
                           '9782122333',
                           '3246556444'
                       // more days and times
[time_group_id] => Array(
                      'monday' => Array(
                           '1123323444',
                           '4443543644',
                           '1123323444',
                           '2332133242',
                           '9782122333',
                           '3246556444'
                       ),
                       'tuesday' => Array(
                           '1123323444',
                           '4443543644',
                           '1123323444',
                           '2332133242',
                           '9782122333',
                           '3246556444'
                       // more days and times


foreach ($day_times as $timegroup => $days) {
    foreach ($days as $day => $times) {
    echo $day .': ';
    echo date('g:ia', min($times));
    echo ' to ';
    echo date('g:ia', max($times));     
    echo '<br />';
    } 
}

这将为您提供每一天的开始和结束时间。因为您希望它们按连续天数分组:

// within your query while loop
$day_times[$row['time_group_id']]['times'][] = $start_time
$day_times[$row['time_group_id']]['times'][] = $end_time;
$day_times[$row['time_group_id']]['days'][]  = $day;

foreach ($day_times as $timegroup) {
    $first_day = array_shift($timegroup['days']);
    $last_day = array_pop($timegroup['days']);
    $times = $timegroup['times'];

    echo $days_map[$first_day] . ' - ' . $days_map[$last_day] . ': ';
    echo date('g:ia', min($times));
    echo ' to ';
    echo date('g:ia', max($times));     
    echo '<br />';
}   

这假设您按连续顺序提取日期,例如周一、周二、周三、周四。

更新:

这整个块应该是你所需要的:

$day_times = array();
$days_map = array(
  'monday'     => 'Mon',
  'tuesday'    => 'Tue',
  'wednesday'  => 'Wed',
  'thursday'   => 'Thu',
  'friday'     => 'Fri',
  'saturday'   => 'Sat',
  'sunday'     => 'Sun'
);

$query = mysql_query("SELECT distinct time_group_id, start_time, end_time 
FROM times WHERE place_id = '80' ORDER BY id ASC");

while ($row=mysql_fetch_assoc($query)) {
    $start_time = stripslashes($row['start_time']);
    $end_time = stripslashes($row['end_time']);

    $start_time = strtotime("$start_time");
    $end_time = strtotime("$end_time");

    $day = strtolower($row['day']);

    $day_times[$row['time_group_id']]['times'][] = $start_time
    $day_times[$row['time_group_id']]['times'][] = $end_time;
    $day_times[$row['time_group_id']]['days'][]  = $day;
}

foreach ($day_times as $timegroup) {
    $first_day = array_shift($timegroup['days']);
    $last_day = array_pop($timegroup['days']);
    $times = $timegroup['times'];

    echo $days_map[$first_day] . ' - ' . $days_map[$last_day] . ': ';
    echo date('g:ia', min($times));
    echo ' to ';
    echo date('g:ia', max($times));     
    echo '<br />';
}  

更新 2:

$day_times = array();
$days_map = array(
  'monday'     => 'Mon',
  'tuesday'    => 'Tue',
  'wednesday'  => 'Wed',
  'thursday'   => 'Thu',
  'friday'     => 'Fri',
  'saturday'   => 'Sat',
  'sunday'     => 'Sun'
);

$query = mysql_query("SELECT distinct time_group_id, start_time, end_time, day
FROM times WHERE place_id = '80' ORDER BY id ASC");

while ($row=mysql_fetch_assoc($query)) {
    $start_time = stripslashes($row['start_time']);
    $end_time = stripslashes($row['end_time']);

    $start_time = strtotime("$start_time");
    $end_time = strtotime("$end_time");

    $day = strtolower($row['day']);

    $day_times[] = $start_time
    $day_times[] = $end_time;
    $days[]      = $day;
}

$first_day = array_shift($days);
$last_day = array_pop($days);

echo $days_map[$first_day] . ' - ' . $days_map[$last_day] . ': ';
echo date('g:ia', min($day_times));
echo ' to ';
echo date('g:ia', max($day_times));    
echo '<br />';

【讨论】:

  • 谢谢 - 我对 [time_group_id] => 数组有点困惑...我需要创建这些,还是可以跳到 foreach ($day_times as $timegroup => $days ) 行?
  • 这只是让您了解您在 while 循环中创建的数组的结构,就像您 var_dumped $day_times 数组一样 - 所以是的,忽略它。它只是为了澄清数组结构。
  • 我是否同时使用两个 foreach 语句?或者只是第二个说“//在你的查询while循环中”?
  • 接近 - 我用底部的“输出”更新了我的问题。这就是我目前从您修改后的代码中看到的。关于如何调整的任何想法?
  • 将日期添加到您的 mysql 查询中 - 您没有从表中获取它。
【解决方案2】:

看看 PHP 提供的Date and Time 函数和类。与尝试自己重新创建此功能相比,它会让您的生活更轻松。

DateTime 类非常智能,可以接受大多数表示日期和时间的字符串格式。如果你永远在64位处理器上或者不担心2038年strtotime()也很强大。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-02
    相关资源
    最近更新 更多