如何在循环和数组内部插入数据
how to insert data while looping and inside array as well
这是我的 table 订单:
+-------+-------+
| month | count |
+-------+-------+
| 6 | 11 |
| 11 | 27 |
| 12 | 9 |
+-------+-------+
我想使用 fusioncharts 创建图表。假设年份是 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);
您现在有一个数组,其中包含从 1 到 12 的 12 个元素(月),所有元素的值为 false
。 (如果需要,您可以使用任何值、数组或 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)
)
现在您可以用值 0
替换数组的所有 false
值
因此您的整个代码可以缩短为:
//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 的所有月份的列表,如果您的查询中存在这样的月份,则它会填充实际值。否则为零。
这是我的 table 订单:
+-------+-------+ | month | count | +-------+-------+ | 6 | 11 | | 11 | 27 | | 12 | 9 | +-------+-------+
我想使用 fusioncharts 创建图表。假设年份是 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);
您现在有一个数组,其中包含从 1 到 12 的 12 个元素(月),所有元素的值为 false
。 (如果需要,您可以使用任何值、数组或 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)
)
现在您可以用值 0
false
值
因此您的整个代码可以缩短为:
//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 的所有月份的列表,如果您的查询中存在这样的月份,则它会填充实际值。否则为零。