Это мой порядок в таблице:
+-------+-------+ | month | count | +-------+-------+ | 6 | 11 | | 11 | 27 | | 12 | 9 | +-------+-------+
Я хочу создать график, используя плагины. Скажем, год 2017. Как помещать недостающий месяц в массив, который я использую в планах fusioncharts? Я застрял в этом состоянии.
Это мой код:
$strQuery2 = "SELECT DATE_FORMAT(order_date, '%c') as month, COUNT(*) AS cnt FROM orders where YEAR(order_date)='2017' GROUP BY month ORDER BY 'month' DESC";
$result2 = $dbhandle->query($strQuery2);
// Push the data into the array
while($row2 = $result2->fetch_assoc()) {
$q = $row2["month"];
$w = $row2["cnt"];
$e = 0;
$x = 1;
if ($x != $q){
echo "true";
array_push($arrData2["data"],
array(
"label" => $row2[$x],
"value" => $row2[$e]
)
);
}
else{
echo "false";
array_push($arrData2["data"],
array(
"label" => $row2["month"],
"value" => $row2["cnt"]
)
);
}
$x++;
echo $row2["month"] . "<br />";
echo $row2["cnt"] . "<br />";
}
Вы никогда не получаете месяц из базы данных, которой нет. Если вы вставляете данные в пустой массив:
array_push($arrData2["data"]
вы все равно получаете массив, содержащий только месяцы, возвращаемые из базы данных.
Что вы можете сделать, так это сначала создать массив со всеми 12 месяцами:
$arrData2["data"]=range(1,12,false);
Теперь у вас есть массив, содержащий 12 элементов (месяцев) от 1 до 12, со значениями false
. (Вы можете использовать любое значение, массив или ложь, если вам нужно). Теперь в вашем результирующем окне просто замените элементы массива, для которых у вас есть значения:
$arrData2["data"][$row2["month"]] = array(
'label' => $row2["month"],
'value' => $row2["cnt"]
);
$ arrData2 теперь будет выглядеть так:
array(
1 => false,
2 => false,
3 => false,
4 => false,
5 => false,
6 => array('label'=> 6,'value'=> 11),
7 => false,
8 => false,
9 => false,
10 => false,
11 => array('label'=> 11,'value'=> 27),
12 => array('label'=> 12,'value'=> 9)
)
Теперь вы можете заменить все false
значения для массивов на значение 0
Таким образом, весь ваш код можно было бы сгладить:
//set empty array
$arrData2['data'] = range(1, 12, false);
//fill elements we know
while($row2 = $result2->fetch_assoc()) {
$arrData2["data"][$row2["month"]] = array(
'label' => $row2["month"],
'value' => $row2["cnt"]
);
}
//replace the rest with 0
foreach($arrData2["data"] as $key => $value){
// skip what we already know
if($values !== false) continue;
// replace the rest
$arrData2["data"][$key]=array(
'label'=>$key,
'value'=> 0
);
}
echo print_r($arrData2,true);
Есть два способа приблизиться к нему. Один для заполнения отсутствующих месяцев на стороне PHP и один на SQL. Я дам вам версию SQL
:
SELECT
m.'month',
IFNULL(x.cnt, 0) AS cnt
FROM
(SELECT 1 AS 'month' UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10 UNION SELECT 11 UNION SELECT 12) AS m
LEFT JOIN (SELECT DATE_FORMAT(order_date, '%c') as 'month', COUNT(*) AS cnt FROM orders where YEAR(order_date)='2017' GROUP BY 'month') AS x ON m.'month' = x.'month'
ORDER BY m.'month' DESC
Он в основном генерирует список всех месяцев от 1 до 12, и если такой месяц существует в вашем запросе, он заполняется реальной стоимостью. В противном случае он равен нулю.