我有一個 Mysql 查詢,它從資料庫中獲取每月記錄以用于繪制圖表。如果沒有足夠的資料覆寫全年(12 個月),則僅繪制 2 個月的圖表。這意味著我需要創建一個陣列,該陣列可以用“收入”零值初始化所有月份。然后用 DB 中的值替換“收入”值。
$year = date('Y');
for ($i = 1; $i < 13 ; $i ) {
$month = date('M-Y', strtotime('01-'.$i.'-'.$year));
$income = 0;
$months[] = array('dates' =>$month, 'income'=>$income);
}
print_r($months);
/*Output Array
(
[0] => Array
(
[dates] => Jan-2022
[income] => 0
)
[1] => Array
(
[dates] => Feb-2022
[income] => 0
)
etc.. etc.. up to Dec-2022
*/
從 Db 這是我的結果。因為資料只有 1 和 1/2 個月大。
/*DBOutput
Array
(
[0] => Array
(
[dates] => Sep-2022
[income] => 1864
)
[1] => Array
(
[dates] => Oct-2022
[income] => 548
)
)*/
請參閱我的以下代碼。盡管2022 年 10 月的“收入”輸出正確,但似乎將2022 年 9 月的“收入”替換為 0 。
foreach ($months as $key) {
foreach ($dbdata as $db) {
if ($key['dates'] === $db['dates']) {
$net = $db['income'];
$dates = $db['dates'];
}
else{
$net = $key['income'];
$dates = $key['dates'];
}
}
$graphData[] = array('dates' => $dates, 'income' => $net);
}
if ($graphData) {
echo json_encode($graphData);
}
/*Output
[{"dates":"Jan-2022","income":0},{"dates":"Feb-2022","income":0},{"dates":"Mar-2022","income":0},{"dates":"Apr-2022","income":0},{"dates":"May-2022","income":0},{"dates":"Jun-2022","income":0},{"dates":"Jul-2022","income":0},{"dates":"Aug-2022","income":0},{"dates":"Sep-2022","income":0},{"dates":"Oct-2022","income":548},{"dates":"Nov-2022","income":0},{"dates":"Dec-2022","income":0}]
*/
如您所見,9 月份的收入沒有獲得 DB 值。我很確定這段代碼只會推送 dbArray 中的最后一個收入值,這是不正確的。
uj5u.com熱心網友回復:
您的代碼看起來很好并且邏輯正確。
您只需將“收入”值替換為 DB 中的值。
像這樣做:
foreach ($dbdata as $db) {
// first find the key of the element
$key = array_search($db['dates'], array_column($months, 'dates'));
if($key !== false)){
$months[$key]['income'] = $db['income'];
}
}
uj5u.com熱心網友回復:
在每次迭代中呼叫array_column()and并不是一種有效的方法。array_search()
通過基于值宣告每一行的第一級關聯鍵,將您的資料庫結果集轉換為查找陣列dates。
然后,當您構建每月行時,檢查查找陣列并在資料庫中未表示月份時回退到默認值。
代碼:(演示)
$db = [
['dates' => 'Sep-2022', 'income' => 1864],
['dates' => 'Oct-2022', 'income' => 548]
];
$lookup = array_column($db, null, 'dates');
$year = date('Y');
for ($i = 1; $i < 13 ; $i) {
$date = date('M-Y', strtotime("$year-$i-01"));
$months[] = $lookup[$date]
?? ['dates' => $date, 'income' => 0];
}
var_export($months);
也就是說,如果這是我的應用程式,我可能只是加入派生表,該表使用默認值預填充給定年份中的所有月份,以便所有資料準備都在 SQL 查詢中完成。看到這個和這個。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/518129.html
