简体   繁体   English

以月为单位显示日期

[英]Display dates in month wise

I've select some dates from the database and display these dates in month wise.. Am using the following code 我从数据库中选择了一些日期,并按月显示这些日期。我使用以下代码

$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;
}

Got the result like 得到了结果

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

I want to display these dates like 我想显示这些日期

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

Is this possible? 这可能吗? Please help 请帮忙

Here is something that will work but needs to be tested. 这是可行的,但需要进行测试。 You need to insert your logic in the dateIsValid() function. 您需要在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
  }

Notes : 备注:

  1. This grouping is possible in SQL and should most probably done over there. 这种分组在SQL中是可能的,并且很可能在那里完成。
  2. Move all your logic to a separate function 将所有逻辑移动到单独的功能
  3. For db access use PHP's PDO API or an ORM like redBean 对于db访问,请使用PHP的PDO API或类似redBean的ORM
  4. Write comments in your code Comments should explain what logic has been implemented. 在代码中写注释注释应解释已实现的逻辑。
  5. Use better variable names. 使用更好的变量名称。
  6. Use DateTime instead of date() (See comment below). 使用DateTime而不是date()(请参阅下面的注释)。

You want an array where the key is the full month name. 您需要一个数组,其中键是完整的月份名称。 You'll want to do something like this... 你会想做这样的事......


Here is a sample script: http://codepad.org/pJOpDr17 这是一个示例脚本: 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'];
}

SAMPLE OUTPUT 样本输出

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"
  }
}

You could do something like this to get what you are looking for 你可以做这样的事情来获得你想要的东西

Use DateTime like Dutchie432 suggested 像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;
  }
}

Instead of printing the dates as and when add the dates to an array like 而不是在将日期添加到数组中时打印日期

wherever you are using echo $test_date apend to an array say 无论你在哪里使用echo $ test_date apend到数组说

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

and now use the loop to display dates 现在使用循环显示日期

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>';

}

I dont know the format to print the month name from the date. 我不知道从日期打印月份名称的格式。 So please ignore print month name and replace with the actual php function to print month name 所以请忽略打印月份名称并替换为实际的php函数来打印月份名称

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM