0

データベースからいくつかの日付を選択し、これらの日付を月ごとに表示しました。次のコードを使用しています

$work_res = mysql_query("(SELECT DISTINCT date FROM `work_details` WHERE  employee_id='" . $emp_id . "' and date between  '" . $qsdate . "' and '" . $qedate . "') UNION (SELECT holy_date from holiday where holy_date between  '" . $qsdate . "' and '" . $qedate . "')");


    while ($row = mysql_fetch_array($work_res)) {
 echo date("F", $test_date).'<br>';
        while ((date("Y-m-d", $test_date) < $row['date']) && ($flag = 0)) {

            if (!(date('N', strtotime(date("Y-m-d", $test_date))) >= 6)) {

                echo "<tr ><td align=center class=fontclass style=color:FF0000>" . date("Y-m-d F", $test_date) . "</td></tr>";
            }
            $test_date = $test_date + ($day_incrementer * 60 * 60 * 24);
        }
        $flag = 1;


        while ((date("Y-m-d", $test_date) != $row['date'])) {

            if (!(date('N', strtotime(date("Y-m-d", $test_date))) >= 6)) {
                echo "<tr><td align=center class=fontclass style=color:FF0000>" . date("Y-m-d F", $test_date) . "</td></tr>";
            }
            $test_date = $test_date + ($day_incrementer * 60 * 60 * 24);
        }
        $test_date = $test_date + ($day_incrementer * 60 * 60 * 24);
    }


    while (date("Y-m-d", $test_date) <= date("Y-m-d", $end_date)) {
        if (!(date('N', strtotime(date("Y-m-d", $test_date))) >= 6)) {
            echo "<tr><td align=center class=fontclass style=color:FF0000>" . date("Y-m-d F", $test_date) . "</td></tr>";
        }
        $test_date = $test_date + ($day_incrementer * 60 * 60 * 24);
    }


    return;
}

次のような結果が得られました

2012-01-16 January
2012-01-26 January
2012-01-27 January
2012-02-02 February
2012-03-21 March
2012-03-22 March

これらの日付を次のように表示したい

 January (3)
    2012-01-16
    2012-01-26
    2012-01-27
February (1)
    2012-02-02 
March(2)
    2012-03-21 
    2012-03-22 

これは可能ですか?助けてください

4

4 に答える 4

1

これは機能しますが、テストする必要があるものです。dateIsValid()関数にロジックを挿入する必要があります 。

<?php

$work_res = mysql_query("(SELECT DISTINCT date FROM `work_details` WHERE  employee_id='" . $emp_id . "' and date between  '" . $qsdate . "' and '" . $qedate . "') UNION (SELECT holy_date from holiday where holy_date between  '" . $qsdate . "' and '" . $qedate . "')");


 //Group all dates into their Months
 while($result =  @mysql_fetch_array($work_res))
  {
    $date = $result['date'];
    $month = date("F",$date );

    //Your complex logic in between...
    if(dateIsValid())
       $output[$month][] = date("Y-m-d", $date);
  }

 //Display as required
 foreach($output as $month => $dates)
  {
    echo $month." (".count($dates).")"; //Echo the month heading
    foreach($dates as $date) echo $date; //Echo the date
  }

ノート :

  1. このグループ化はSQLで可能であり、おそらくそこで行う必要があります。
  2. すべてのロジックを別の関数に移動します
  3. dbアクセスには、PHPのPDOAPIまたはredBeanのようなORMを使用します
  4. コードにコメントを書き込むコメントは、実装されているロジックを説明する必要があります。
  5. より適切な変数名を使用してください。
  6. date()の代わりにDateTimeを使用します(以下のコメントを参照)。
于 2012-06-14T10:06:13.467 に答える
1

キーが完全な月の名前である配列が必要です。あなたはこのようなことをしたいと思うでしょう...


サンプルスクリプトは次のとおりです:http://codepad.org/pJOpDr17

$dateArray=array();

while (($row = mysql_fetch_array($work_res)){
    $d = new DateTime($row['date']);
    $monthName = $d->format('F');
    //$monthName = $d->format('F_Y'); (If you want month_year)
    $dateArray[$monthName][] = $row['date'];
}

サンプル出力

array(3) {
  ["January"]=>
  array(3) {
    [0]=>
    string(10) "2012-01-16"
    [1]=>
    string(10) "2012-01-26"
    [2]=>
    string(10) "2012-01-27"
  }
  ["February"]=>
  array(1) {
    [0]=>
    string(10) "2012-02-02"
  }
  ["March"]=>
  array(2) {
    [0]=>
    string(10) "2012-03-21"
    [1]=>
    string(10) "2012-03-22"
  }
}
于 2012-06-14T10:12:03.647 に答える
0

あなたはあなたが探しているものを得るためにこのようなことをすることができます

Dutchie432が提案するようにDateTimeを使用する

result = array();
while ($row = mysql_fetch_array($work_res))
{
  $tmp_time = strtotime(row['date']);
  $tmp_month = date('F',$tmp_time);
  $tmp_date = date('Y-m-d', $tmp_time);
  if(!is_array($result[$tmp_month]))
  {
    $result[$tmp_month] = array();
  }
  array_push(result[$tmp_month], $tmp_date);
}

# this will print something similar to your req
foreach($result as $month => $dates)
{
  echo $month . " (" . $result[$month].length . ")";
  foreach($dates as $date)
  {
    echo $date;
  }
}
于 2012-06-14T09:57:07.810 に答える
0

日付を次のように配列に追加するときに、日付を出力する代わりに

echo $ test_dateを使用している場合は常に、配列に追加します。

$leavesTakes[]=$date("Y-m-d F", $test_date)

ループを使用して日付を表示します

for($i=0;$i<count($leavesTakes);$i++)
{
  $cnt=0;
  for($j=$i;$j<count($leavestaken);$j++)
  {
    if($leavesTaken[$i]!=$leavesTaken[$j])
        break;

     $cnt++;
  }

  //print month name
  echo '<tr><td> month name (' + $cnt + ')'; //print month name

  for(;$i<$j;$i++)        
    echo '<br/>$date("Y-m-d F", $leavesTaken[$i]);

   echo '</td></tr>';

}

日付から月の名前を印刷する形式がわかりません。したがって、月の名前の印刷を無視し、実際のphp関数に置き換えて月の名前を印刷してください

于 2012-06-14T10:19:27.377 に答える