【问题标题】:Manipulating arrays of dates in PHP在 PHP 中操作日期数组
【发布时间】:2014-12-12 22:15:44
【问题描述】:

我在处理PHP 中的一段代码时遇到了很多困难。我有一个日期和值的数组,例如

dates = (2014-12-01,2014-12-02,2014-12-08,2014-12-09,2014-12-10,2014-12-11)
values = (5,3,7,8,9,2)

您会注意到12/01 是星期一,12/08 也是如此。我想从这两个数组中形成 4 个数组:

monday = (5,7)
tuesday = (3,8)
wednesday = (0,9)
thursday = (0,2)

您会注意到,数组是通过抓取与星期几相关的值形成的。但是,如果存在星期三日期,但前一个星期二不存在,则数组应该有一个“0”。也就是说,这4个数组的长度应该都是一样的。

谁能帮我用 PHP 编写代码来实现这一点?提前致谢!

注意:到目前为止,我只确定了如何从日期中找到星期几:date('l', strtotime("2014-12-08")); 我实在想不出解决这个问题的通用算法。 p>

【问题讨论】:

  • 你尝试了吗?看到它会很有帮助。
  • 解释不清楚
  • 通用算法:遍历date数组。对于每个日期的键/值,确定星期几。将 values 数组中相同键的值添加到键对应于星期几的数组中。
  • @showdev 非常感谢您的想法。不过,我有点困惑。你认为你可以编写 php 代码来做到这一点吗?例如,当遇到“星期一”然后下一个日期也是“星期一”时会发生什么。看起来比你写的要复杂。
  • 您可以附加到“周”数组:$weekdays[$day_of_week][]=$values[$dates_key]; 对不起,我不想写所有的代码——没什么私人的。但是,如果您尝试并遇到问题,SO 社区将帮助您对代码进行故障排除。

标签: php arrays date


【解决方案1】:
$dates  = array( '2014-12-01','2014-12-02','2014-12-08','2014-12-09',
                 '2014-12-10','2014-12-11' );
$values = array( 5, 3, 7, 8, 9, 2 );

$date  = strtotime(min($dates));
$stop  = strtotime(max($dates));
$dates = array_flip($dates);
$out   = array();

while($date <= $stop)
{
   $tmp = date('Y-m-d', $date);
   $out[date('l', $date)][] = isset($dates[$tmp]) && isset($values[$dates[$tmp]]) ?
                              $values[$dates[$tmp]] : 0;  
   $date = strtotime('+1 day', $date);   
}

print_r($out);

结果:

Array
(
    [Monday] => Array
        (
            [0] => 5
            [1] => 7
        )

    [Tuesday] => Array
        (
            [0] => 3
            [1] => 8
        )

    [Wednesday] => Array
        (
            [0] => 0
            [1] => 9
        )

    [Thursday] => Array
        (
            [0] => 0
            [1] => 2
        )

    [Friday] => Array
        (
            [0] => 0
        )

    [Saturday] => Array
        (
            [0] => 0
        )

    [Sunday] => Array
        (
            [0] => 0
        )

)

ps:how can I get the an array of all the dates included in the "dates" array associated with only all the Mondays?

将代码修改为,例如:

   $tmp = date('Y-m-d', $date);
   $exists = isset($dates[$tmp]) && isset($values[$dates[$tmp]]);
   $out[date('l', $date)]['numbers'][] = $exists ? $values[$dates[$tmp]] : 0; 
   if ($exists) $out[date('l', $date)]['dates'][] = $tmp;
   $date = strtotime('+1 day', $date);  

你会得到一个输出(例如星期一)

[Monday] => Array
    (
        [numbers] => Array
            (
                [0] => 5
                [1] => 7
            )

        [dates] => Array
            (
                [0] => 2014-12-01
                [1] => 2014-12-08
            )

    )

【讨论】:

  • @CodeGuy 不确定您在说什么。 $monday = $out['Monday']; .. 等等?
  • 非常感谢!!抱歉,我想问:如何获取包含在“日期”数组中的所有日期的数组,该数组仅与所有星期一相关联?
  • 太好了,谢谢!最后一件事:假设日期是有序的。如果日期不按顺序排列,那么应该对日期和相关索引进行排序怎么办。我怎么能这样做?
  • @CodeGuy 我的代码不关心日期的顺序,只要 $values 和 $dates 相互对应。但如果你真的需要它 - stackoverflow.com/a/9917886/1164491
  • @CodeGuy 给我数据示例。它不应该取决于顺序。还是您正在查看[dates] =&gt; Array 中的值?检查上面的链接。
【解决方案2】:

可能是在没有另一个循环的情况下将0s 放入其中的更好方法,但我要离开了:

foreach($dates as $key => $val) {
    $day = date('l', strtotime($val));
    $result[$day][] = $values[$key];
}
foreach($result as &$val) {
    if(count($val) == 1) {
        array_unshift($val, 0);
    }
}
print_r($result);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-23
    • 1970-01-01
    • 2010-09-10
    • 2016-12-31
    • 1970-01-01
    • 2018-12-23
    • 2018-06-30
    • 1970-01-01
    相关资源
    最近更新 更多