gpt4 book ai didi

php - 数组循环假设为零数据?

转载 作者:行者123 更新时间:2023-11-29 11:18:34 25 4
gpt4 key购买 nike

我使用时间戳在每个月的计数循环中创建了一个自动填充数组,例如 2016-06-11 00:00:00 - 循环从中获取的数据库布局是:

TimeRecord          | Views 
2016-06-11 00:00:00 | 22
2016-08-11 00:00:00 | 44

现在,上面的示例跳过了 07(七月)月份,这个月没有数据,因此当循环经过这个月时,它应该返回 null 或 0,但它返回之前已知的数字(在本例中为 22)。

对于 2016-09,没有指定的数据,因此数组将给出“44”。

循环并从数据库获取以生成数组的代码如下:

$startMonth = date("y-m-d");
$endMonth = date("y-m-d");

while ($Month <= 12){

$ViewsThisMonth = mysqli_fetch_object(mysqli_query($db, "SELECT SUM(Views) AS NumberFinalViews, EXTRACT(YEAR_MONTH FROM TimeRecord) AS YearMonth FROM BlogViews WHERE TimeRecord > '$startMonth' AND TimeRecord < '$endMonth' GROUP BY YearMonth"));

if (is_null($ViewsThisMonth->NumberFinalViews)){
$ViewsThisMonth->NumberFinalViews = 0;
}

$ArrayTimeStamp[] = $ViewsThisMonth->NumberFinalViews;
$Month = $Month + 1;
$startMonth = date("y-m-d",strtotime("-$Month month"));
}

返回的 JSON 编码数组的示例是:

[0,"29392","333","4000","4000","99","99","99","99","99","99","99"]

可以找到导致上述数组的数据库值的屏幕截图 here 。正如您所看到的,4000 重复了两次,因为第 5 个月没有记录,导致它使用第 4 个月的数据。 99 也会重复,因为第 6-12 个月没有值,因此它使用第 6 个月的值而不是返回 0。

如果循环执行时该月没有TimeRecord,我希望它返回0,而不是假设观看次数与上个月相同。

最佳答案

问题是您多次执行相同的查询,尽管日期发生了变化。该查询旨在提供几个月的结果,但您只使用结果行之一。由于没有 order by 子句,因此您可能会以意外的顺序获取行。另外,在循环中更改开始日期的方式很奇怪:它在时间上向后移动。

最好只执行一次查询,然后将结果存储到以月-年为键的准备好的数组中。

请注意,您可以使用 COALESCE 在 SQL 查询本身中执行空检查。

代码变成这样:

$startYearMonth = date('Ym', strtotime("2015-01-01")); // set this date as you wish
$endYearMonth = date('Ym', strtotime("now"));

// Prepare result array: one entry per month, with all values set to 0
for ($yearMonth = $startYearMonth; $yearMonth <= $endYearMonth;
$yearMonth += ($yearMonth % 100 == 12 ? 89 : 1)) {
$months[$yearMonth] = 0;
}

// improved query
$result = mysqli_query($db, "
SELECT COALESCE(SUM(Views), 0) AS NumberFinalViews,
EXTRACT(YEAR_MONTH FROM TimeRecord) AS YearMonth
FROM BlogViews
WHERE EXTRACT(YEAR_MONTH FROM TimeRecord)
BETWEEN '$startYearMonth' AND '$endYearMonth'
GROUP BY YearMonth");

// Featch and store each result in their proper year-month slot
while ($ViewsThisMonth = mysqli_fetch_object($result)) {
$months[$ViewsThisMonth->YearMonth] = $ViewsThisMonth->NumberFinalViews;
}

// output the result
print_r($months);

关于php - 数组循环假设为零数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39348799/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com