【问题标题】:How can do this PHP code using DRY method?如何使用 DRY 方法执行此 PHP 代码?
【发布时间】:2017-09-07 03:42:12
【问题描述】:

我正在尝试从第 01 天到第 30 天找出本月的日常销售。我一次又一次地使用日期功能。并且每次都使用相同的变量。我的代码很大,看起来很糟糕。我怎样才能使这段代码更智能,这样我就不必编写所有这些代码了。只用一个循环就可以完成所有事情......谢谢

    //first date
    $todaySdate=date("Y-m-01 " );
    $todayEdate=date("Y-m-01 23:59:59 ");
    $this->db->select('*'); 
    $this->db->from('ospos_sales AS A');
    $this->db->join('ospos_sales_payments AS B', 'B.sale_id = A.sale_id', 'left');  
    $this->db->where('A.sale_time >=', $todaySdate);
    $this->db->where('A.sale_time <=', $todayEdate);
    $Todaysales = $this->db->get()->result_array();      

    $todaySale=0;
     foreach($Todaysales as $d)
     {
        $todaySale+=$d['payment_amount'];
     }

     echo $todaySdate.'TK  :' .number_format( $todaySale,"2" )."</br>";

     $startDate=date("Y-m-d" );
     $endDate=date("Y-m-d");


   // second date
     $todaySdate=date("Y-m-02 " );
    $todayEdate=date("Y-m-02 23:59:59");
    $this->db->select('*'); 
    $this->db->from('ospos_sales AS A');
    $this->db->join('ospos_sales_payments AS B', 'B.sale_id = A.sale_id', 'left');  
    $this->db->where('A.sale_time >=', $todaySdate);
    $this->db->where('A.sale_time <=', $todayEdate);
    $Todaysales = $this->db->get()->result_array();      

    $todaySale=0;
     foreach($Todaysales as $d)
     {
        $todaySale+=$d['payment_amount'];
     }

     echo $todaySdate.'TK  :' .number_format( $todaySale,"2" )."</br>";

     $startDate=date("Y-m-d" );
     $endDate=date("Y-m-d");


     //third date
     $todaySdate=date("Y-m-03 " );
    $todayEdate=date("Y-m-03 23:59:59");
    $this->db->select('*'); 
    $this->db->from('ospos_sales AS A');
    $this->db->join('ospos_sales_payments AS B', 'B.sale_id = A.sale_id', 'left');  
    $this->db->where('A.sale_time >=', $todaySdate);
    $this->db->where('A.sale_time <=', $todayEdate);
    $Todaysales = $this->db->get()->result_array();      

    $todaySale=0;
     foreach($Todaysales as $d)
     {
        $todaySale+=$d['payment_amount'];
     }

     echo $todaySdate.'TK  :' .number_format( $todaySale,"2" )."</br>";

     $startDate=date("Y-m-d" );
     $endDate=date("Y-m-d");

     // fourth date date
     $todaySdate=date("Y-m-04 " );
    $todayEdate=date("Y-m-04 23:59:59");
    $this->db->select('*'); 
    $this->db->from('ospos_sales AS A');
    $this->db->join('ospos_sales_payments AS B', 'B.sale_id = A.sale_id', 'left');  
    $this->db->where('A.sale_time >=', $todaySdate);
    $this->db->where('A.sale_time <=', $todayEdate);
    $Todaysales = $this->db->get()->result_array();      

    $todaySale=0;
     foreach($Todaysales as $d)
     {
        $todaySale+=$d['payment_amount'];
     }

     echo $todaySdate.'TK  :' .number_format( $todaySale,"2" )."</br>";

     $startDate=date("Y-m-d" );
     $endDate=date("Y-m-d");

     // Fifth date
     $todaySdate=date("Y-m-05 " );
    $todayEdate=date("Y-m-05 23:59:59");
    $this->db->select('*'); 
    $this->db->from('ospos_sales AS A');
    $this->db->join('ospos_sales_payments AS B', 'B.sale_id = A.sale_id', 'left');  
    $this->db->where('A.sale_time >=', $todaySdate);
    $this->db->where('A.sale_time <=', $todayEdate);
    $Todaysales = $this->db->get()->result_array();      

    $todaySale=0;
     foreach($Todaysales as $d)
     {
        $todaySale+=$d['payment_amount'];
     }

     echo $todaySdate.'TK  :' .number_format( $todaySale,"2" )."</br>";

     $startDate=date("Y-m-d" );
     $endDate=date("Y-m-d");
     ........
      .......
      .......

我的代码的示例输出..

2017-09-01 TK :0.00
2017-09-02 TK :1,186.55
2017-09-03 TK :1,311.45
2017-09-04 TK :0.00
.........
........ .
2017-09-30 TK :0.00

【问题讨论】:

  • 你可能会发现这个问题更适合CodeReview
  • 如前所述,这对代码审查来说会更好,但我会先创建一个函数或类/方法来包含 dup 代码。
  • 你能帮我吗? @拉斯克拉特
  • 您也可以使用for() 循环执行此操作,只需增加date()

标签: php codeigniter dry


【解决方案1】:

这里是例子,你可以如何重构你的代码。

<?php

function get_today_sales (\DateTime $date) {
    $start_date = $date->setTime(0, 0);
    $end_date = $start_date->add(new DateInterval('P1D'));

    /*    
    $this->db->select('*'); 
    $this->db->from('ospos_sales AS A');
    $this->db->join('ospos_sales_payments AS B', 'B.sale_id = A.sale_id', 'left');  
    $this->db->where('A.sale_time >=', $todaySdate);
    $this->db->where('A.sale_time <=', $todayEdate);
    $Todaysales = $this->db->get()->result_array();      

    $todaySale = 0;
    foreach($Todaysales as $d) {
        $todaySale+=$d['payment_amount'];
    }

    return $today_sale;
    */
}

$start = new DateTime('2017-10-01');
$end = new DateTime('2017-10-20');

$interval = new DateInterval('P1D');
$period = new DatePeriod($start, $interval, $end);


foreach ($period as $day) {
    printf("%s -> %s\n", $day->format('Y-m-d'), get_today_sales($day));
}

【讨论】:

  • 当然。它不是工作代码。只是给你的例子,看看你如何重写你的代码
  • @MirthfulNahid 至少删除评论块并更改变量名称 ;-)
猜你喜欢
  • 1970-01-01
  • 2011-08-17
  • 1970-01-01
  • 2012-12-14
  • 2013-04-10
  • 2020-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多