Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从数据库获取每日销售额-无销售额天数应显示0-最近30天的销售额_Php_Mysql_Datetime - Fatal编程技术网

Php 从数据库获取每日销售额-无销售额天数应显示0-最近30天的销售额

Php 从数据库获取每日销售额-无销售额天数应显示0-最近30天的销售额,php,mysql,datetime,Php,Mysql,Datetime,我需要为过去30天的销售额创建一个统计图表。有些日子没有销售,所以这些日子我必须显示0 MySQL SELECT COUNT(*) as total, DAY(FROM_UNIXTIME(tmstmp)) AS soldDay FROM tl_voucher_create WHERE sold = 1 GROUP BY soldDay ORDER BY tmstmp DESC 0,30 结果的PHP数组 Array ( [0] => Array (

我需要为过去30天的销售额创建一个统计图表。有些日子没有销售,所以这些日子我必须显示0

MySQL

SELECT COUNT(*) as total, DAY(FROM_UNIXTIME(tmstmp)) AS soldDay
FROM tl_voucher_create
WHERE sold = 1 
GROUP BY soldDay
ORDER BY tmstmp DESC 0,30
结果的PHP数组

Array
(
    [0] => Array
        (
            [total] => 1
            [soldDay] => 24
        )

    [1] => Array
        (
            [total] => 1
            [soldDay] => 13
        )

    [2] => Array
        (
            [total] => 4
            [soldDay] => 3
        )

    [3] => Array
        (
            [total] => 2
            [soldDay] => 23
        )
使用循环,我将值放入一个新数组:

for ($x = $day; $x < 31; $x++) {
    if (isset($this->_["soldDaily"][$x]["soldDay"])) {
        $total[$x] = $this->_["soldDaily"][$x]["total"];
    } else {
        $total[$x] = 0;
    }
}
for($x=$day;$x<31;$x++){
如果(isset($this->[“soldDay”][$x][“soldDay”])){
$total[$x]=$this->[“solddayy”][$x][“total”];
}否则{
$total[$x]=0;
}
}
如何以正确的顺序将过去30天的值进行正确的输出


提前感谢

根据实际日期查询:

SELECT COUNT(*) AS total, DATE(FROM_UNIXTIME(tmstmp)) AS sold_date
FROM tl_voucher_create
WHERE sold = 1
  AND sold_date BETWEEN DATE(NOW() - INTERVAL 30 DAY) AND CURDATE()
GROUP BY sold_date
ORDER BY sold_date DESC
假设查询结果如下所示:

$data = [
    [
        'total' => 7,
        'sold_date' => '2017-02-28'
    ],
    [
        'total' => 19,
        'sold_date' => '2017-02-27'
    ],
    [
        'total' => 8,
        'sold_date' => '2017-02-24'
    ],
    [
        'total' => 5,
        'sold_date' => '2017-02-22'
    ],
    [
        'total' => 12,
        'sold_date' => '2017-02-21'
    ]
];
您现在需要将PHP基于实际的日期对象,而不仅仅是一个数字30的迭代循环,否则您将在报告中遇到各种问题和不准确之处,因为日期并不像从1循环到30那么简单(月份有不同的天数,您无法轻松跨回上一个月,夏令时问题、不同时区的日期等)

//按日期组织阵列
$dates=[];
foreach($day数据){
$dates[$day['salled_date']=$day['total'];
}
//循环过去30天,并将每次迭代与数据匹配
$d=新的日期时间();
对于($i=0;$i<30;$i++){
$date=$d->format('Y-m-d');
//如果指定日期没有数据,请使用零
$total=isset($dates[$date])?$dates[$date]:0;
回音“”。$total.。于“$date”售出。

”; $d->修改('-1天'); }
太好了!谢谢!!
// Organise the array by date
$dates = [];
foreach ($data as $day) {
    $dates[$day['sold_date']] = $day['total'];
}

// Loop through the last 30 days and match each iteration with the data
$d = new DateTime();
for ($i = 0; $i < 30; $i++) {

    $date = $d->format('Y-m-d');

    // If there's no data for the specified date, use zero
    $total = isset($dates[$date]) ? $dates[$date] : 0;

    echo '<p>' . $total . ' sold on ' . $date . '</p>';

    $d->modify('-1 day');
}