1

この投稿を読んでくれてありがとうと言って始めたいと思います。私は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

今日 (この場合は 6/2 日) を最初に表示し、次に次の 6 日間を順番に表示しようとしています。

print_r を使用して生の出力を表示すると、次のようになります。

配列
(
    [1370239200] => 配列
        (
            [日] => 月曜日
            [略語] => 月
        )

    [1370325600] => 配列
        (
            [日] => 火曜日
            [略語] => 火
        )

    [1370412000] => 配列
        (
            [日] => 水曜日
            [略語] => 水
        )

    [1370498400] => 配列
        (
            [日] => 木曜日
            [略語] => 木
        )

    [1370584800] => 配列
        (
            [日] => 金曜日
            [略語] => 金
        )

    [1370671200] => 配列
        (
            [日] => 土曜日
            [略語] => 土
        )

    [1370757600] => 配列
        (
            [日] => 日曜日
            [略語] => 太陽
        )

)

日曜日のタイム スタンプが他の日よりも大きくなっていますが、これは何らかの理由で今日のタイム スタンプではなく次の日曜日のタイム スタンプが出力されているためですか?

最初は、毎日 2 つの 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'))); 
        }
        ?>

これを達成し、正しい順序でソートするために配列を作成するより良い方法はありますか? 既に作成した配列で単純なものが不足していますか?

あなたが提供できるどんな助けも大歓迎です。

ありがとうございました。

4

3 に答える 3

0

「次の日曜日」を「日曜日」に変更し、それを最初の配列要素として入れれば、うまくいくはずです..

于 2013-06-02T20:23:37.377 に答える
0

私が理解している限り、あなたが達成したいことのために、あなたは物事を過度に複雑にしています:

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

日は自然に自分の思うように進むので、その事実を利用して、まとめてソートするのは避けてください。また、php の日付フォーマットを使用して、短い形式の日数を保存する必要がないようにすることもできます。

アップデート

これにより、何ができるかがわかります。PHP の日付関数を使用して生成できるものについて読んでおくことをお勧めします — これはかなり便利です :)

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));
}
于 2013-06-02T20:27:09.717 に答える
0

日曜日のタイム スタンプが他の日よりも大きくなっていますが、これは何らかの理由で今日のタイム スタンプではなく次の日曜日のタイム スタンプが出力されているためですか?

はい、これはあなたがコーディングしたものです:strtotime('next sunday')

今日と次の 6 日間が必要な場合は、数値を使用してみてください。例: +1 日、...、+6 日: http://www.php.net/manual/en/dateinterval.createfromdatestring.php

于 2013-06-02T20:27:11.033 に答える