编辑:我之前尝试过简化它,但我想我会把它全部放在那里,因为它可能会消除一些关于我要实现的目标的困惑。
我正在使用两个 mySQL 表创建一个 javascript 图表,在同一个图表上显示条形图和折线图。显示出席人数的折线图和显示该日期完成的酿造过程的条形图。 表 A:
id | date | attended
1 |2015-01-14| 3
2 |2015-01-20| 4
3 |2015-01-31| 2
4 |2015-02-21| 3
5 |2015-02-25| 4
6 |2015-03-16| 4
表 B:
id | name | brewdate | bottledate
1 | Honey Ale | 2015-01-14 | 2015-02-21
2 | IPA | 2015-01-14 | 2015-01-31
3 | Porter | 2015-01-20 | 2015-02-25
4 | Brown Ale | 2015-02-21 | 2015-03-16
使用下面的代码,我可以获取数组以用于 zingchart:
<?php
$sql = "SELECT * DATE_FORMAT(DATE(date), '%m/%d') AS bpdate
FROM TableA ORDER BY date";
$data = $conn->query($sql);
?>
<script
//GET array of attendance for line chart
var present=[<?php
mysqli_data_seek($data, 0);
while($info=mysqli_fetch_array($data)) {
echo $info['present'].",";
}
?>];
//Get dates for x-axis of chart
var dates=[<?php
mysqli_data_seek($data, 0);
while($info=mysqli_fetch_array($data))
echo '"'.$info['bpdate'].'",';
?>];
<?php
$sql = "SELECT COUNT(TableB.brewdate) AS brewed
FROM TableB
RIGHT JOIN TableA
ON TableB.brewdate=TableA.date
GROUP BY TableA.date ORDER BY TableA.date";
$events = $conn->query($sql);
?>
//Get number of beers brewed per date
var brewed=[<?php
while($info=mysqli_fetch_array($events)) {
echo $info['brewed'];
}
?>];
<?php
$sql = "SELECT TableB.*
FROM TableB
RIGHT JOIN TableA
ON TableB.date=TableA.date
ORDER BY TableA.date";
$names = $conn->query($sql);
?>
//Get the name of each beer that was brewed.
var brewednames=[<?php
while($info=mysqli_fetch_array($names)) {
echo '"' . $info['name'] . ',"';
}
?>];
</script>
这给了我这个:
var present=[3,4,2,3,4,4];
var dates=["01/14","01/20","01/31","2/21","02/25","03/16"];
var brewednames=["Honey Ale","IPA","Porter","","Brown Ale","",""];
我遇到的问题是变量 brewednames。它正确地为我提供了啤酒列表,其中空白填充了没有酿造啤酒的日期,但它列出了不同数组元素中具有相同日期的啤酒,我希望它们显示在同一个元素中。像这样:
var brewednames=["Honey Ale IPA","Porter","","Brown Ale","",""];
这背后的原因是当用户将鼠标悬停在图表上相应的栏上时会显示此数组。因此,与其显示该日期酿造的啤酒数量,我希望它给出该日期酿造的所有啤酒的名称。
我找到了 this article这能够帮助我将在同一日期酿造的每种啤酒分组在同一数组元素中,但现在它们没有根据日期排序,因为所有空白都已移至数组的开头:
var brewednames=[<?php
$info = array();
while($row=$names->fetch_assoc()) {
$date = $row['date'];
$name = $row['name'];
$info[$date][] = $name;
}
foreach ($info as $date => $values) {
echo '"';
foreach($values as $value) {
echo $value . ' ';
}
echo '",';
}
?>];
这给了我这个:
var namegroup=[" ","Honey Ale IPA","Porter","Brown Ale"]
任何帮助将不胜感激。此外,我确信我的代码并不完美,因为我有点自学 mySQL 和 PHP,所以如果有任何关于更清晰/更好的代码的建议,请随时参与。谢谢。
最佳答案
<?php
$sql = "SELECT TableB.*
FROM TableB
RIGHT JOIN TableA
ON TableB.date=TableA.date
ORDER BY TableA.date ASC";
$names = $con->query($sql);
?>
var namegroup=[<?php
$info = array();
$weirdArr = array();
while($row=$names->fetch_assoc()) {
$date = $row['date'];
$name = $row['name'];
$info[$date][] = $name;
$weirdArr[] = $name;
}
echo implode(',',$weirdArr);
?>];
WEIRD UPDATE 要获取引号中的字符串,只需将行替换为:
echo '"'.implode('","',$weirdArr).'"';
奇怪的更新 2
<?php
$sql = "SELECT TableA.date, GROUP_CONCAT(TableB.name SEPARATOR ' ') as gr_name
FROM TableB
RIGHT JOIN TableA
ON TableB.date=TableA.date
GROUP BY TableA.date
ORDER BY TableA.date ASC";
$names = $con->query($sql);
?>
var namegroup=[<?php
$info = array();
$weirdArr = array();
while($row=$names->fetch_assoc()) {
$date = $row['date'];
$name = $row['gr_name'];
$info[$date][] = $name;
$weirdArr[] = $name;
}
echo implode(',',$weirdArr);
?>];
关于javascript - 在 foreach 语句的数组中包含空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30065015/