【问题标题】:php strtotime array sorting issuephp strtotime数组排序问题
【发布时间】:2013-05-29 00:29:54
【问题描述】:

首先,我想感谢您抽出宝贵时间阅读这篇文章。我希望有人能在我刚开始学习 PHP 时帮助我。如果我没有使用正确的术语来描述我的问题,请原谅我。

我在排序数组时遇到问题。

我的数组如下所示:

<?php
$rooms = array(
  strtotime('next monday')=>array('day'=>'monday', 'abbrev'=>'Mon'),
  strtotime('next tuesday')=>array('day'=>'tuesday', 'abbrev'=>'Tue'),
  strtotime('next wednesday')=>array('day'=>'wednesday', 'abbrev'=>'Wed'),
  strtotime('next thursday')=>array('day'=>'thursday', 'abbrev'=>'Thu'),
  strtotime('next friday')=>array('day'=>'friday', 'abbrev'=>'Fri'),
  strtotime('next saturday')=>array('day'=>'saturday', 'abbrev'=>'Sat'),
  strtotime('next sunday')=>array('day'=>'sunday', 'abbrev'=>'Sun'));
ksort($rooms);

foreach($rooms as $room_timestamp=>$room_info) {
  if (time() > strtotime($room_info['day'])) {
  print ($form->checkBox($model,'space_'.$room_info['day'], array('value' => strtotime($room_info['day']))) . $form->labelEx($model,$room_info['abbrev'].' ' . date('n/j', strtotime($room_info['day']))) . '<br />');
  } else {
  print ($form->checkBox($model,'space_'.$room_info['day'], array('value' => strtotime('next '.$room_info['day']))) . $form->labelEx($model,$room_info['abbrev'].' ' . date('n/j', strtotime('next '.$room_info['day']))) . '<br />');
  }
}

echo "<pre>".print_r($rooms,1)."</pre>";
?>

它按此顺序输出复选框:

6 月 3 日星期一
6 月 4 日星期二
6 月 5 日星期三
6 月 6 日星期四
6 月 7 日星期五
6 月 8 日星期六
6 月 2 日星期日
br>

我试图让今天(在本例中为 6 月 2 日)首先显示,然后在接下来的 6 天按顺序显示。

当我使用 print_r 显示原始输出时,它看起来像这样:

数组
(
    [1370239200] => 数组
        (
            [日] => 星期一
            [缩写] => 星期一
        )

    [1370325600] => 数组
        (
            [天] => 星期二
            [缩写] => 星期二
        )

    [1370412000] => 数组
        (
            [日] => 星期三
            [缩写] => 星期三
        )

    [1370498400] => 数组
        (
            [天] => 星期四
            [缩写] => 星期四
        )

    [1370584800] => 数组
        (
            [日] => 星期五
            [缩写] => 星期五
        )

    [1370671200] => 数组
        (
            [天] => 星期六
            [缩写] => 星期六
        )

    [1370757600] => 数组
        (
            [日] => 星期日
            [缩写] => 太阳
        )

)

周日显示的时间戳比其他日子大,这是因为它以某种方式输出下周日的时间戳而不是今天的时间戳吗?

最初,我每天使用两个 if/else 语句创建复选框和标签。无法以这种方式对它们进行排序,我试图创建一个数组,这就是我现在遇到的问题。

我的原始代码(此示例适用于星期二)如下所示:

            <?php
        if (time() > strtotime('tuesday'))
        {
            echo $form->checkBox($model,'space_tuesday', array('value' => strtotime('tuesday'))); 
        }
        else
        {
            echo $form->checkBox($model,'space_tuesday', array('value' => strtotime('next tuesday'))); 
        }

         ?>
        <?php 
        if (time() > strtotime('tuesday'))
        {
            echo $form->labelEx($model,'Tues ' . date('n/j', strtotime('tuesday'))); 
        }
        else
        {
            echo $form->labelEx($model,'Tues ' . date('n/j', strtotime('next tuesday'))); 
        }
        ?>

有没有更好的方法来创建一个数组来实现这一点并按正确的顺序排序?我已经创建的数组是否缺少一些简单的东西?

如果您能提供任何帮助,我们将不胜感激。

谢谢。

【问题讨论】:

    标签: php arrays sorting yii


    【解决方案1】:

    据我了解,对于您想要实现的目标,您将事情复杂化了:

    for ( $i=0; $i<6; $i++ ) {
      echo date('D n/j', strtotime("+$i day")) . '<br />';
    }
    

    日子自然会按照你想要的方式发展,所以你不妨利用这一事实——避免把所有的东西放在一起。您还可以使用 php 的日期格式来避免存储短格式的日期。

    更新

    这应该让你知道你可以做什么,我建议你阅读一下使用 PHP 的 date 函数可以生成什么——它非常有用:)

    http://uk1.php.net/manual/en/function.date.php

    for ( $i=0; $i<6; $i++ ) {
      /// pull out our datetime into a variable
      $datetime = strtotime("+$i day");
      /// wrap it with an array ready for checkBox()
      $value = array('value' => $datetime);
      /// generate the different parts we may need from date()
      list($day, $formatted) = explode(',', date('l,D n/j', $datetime));
      /// place those parts where we need them
      echo $form->checkBox($model, "space_" . strtolower($day), $value);
      echo $form->labelEx($model, $formatted));
    }
    

    【讨论】:

    • pebbl,非常感谢。我在利用你赋予我的智慧时遇到了一些麻烦。我不明白的部分是我如何将您的解决方案纳入我的复选框语句。 echo $form->checkBox($model,'space_tuesday', array('value' => strtotime('+$i day'))); -- 我怎样才能将正确的日期名称添加到 space_dayname。我有一个类似的问题,试图让它适用于我正在使用的标签声明: echo $form->labelEx($model,'Tues ' . date('n/j', strtotime('+$i天')));
    • pebbl,我感激不尽。我肯定会阅读 php 日期函数,我才刚刚开始学习 PHP,因为直到最近我一直是前端开发人员。如果你曾经在波士顿地区,我很想给你买一品脱!干杯!
    • @AntiHero 啊,不用担心,很高兴它有帮助:) php.net 绝对是你的 php 朋友!祝你学习服务器端好运。
    【解决方案2】:

    把'next sunday'改成'sunday',把它作为第一个数组元素,你应该就好了..

    【讨论】:

      【解决方案3】:

      周日显示的时间戳比其他日子大,这是因为它以某种方式输出下周日的时间戳而不是今天的时间戳吗?

      是的,这就是您的编码:strtotime('next sunday')

      如果需要,请尝试使用今天和未来 6 天的数字,例如 +1 天、...、+6 天:http://www.php.net/manual/en/dateinterval.createfromdatestring.php

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-03
        • 1970-01-01
        • 2011-09-27
        • 2012-02-01
        相关资源
        最近更新 更多