Javascript 在foreach语句的数组中包含空值
编辑:我以前试图简化它,但我想我会把它全部放在那里,因为它可能会消除一些关于我试图实现什么的困惑 我使用两个mySQL表创建一个javascript图表,在同一个图表上显示条形图和线形图。显示出勤情况的线形图和显示该日期酿造过程的条形图。 表A: 表B:Javascript 在foreach语句的数组中包含空值,javascript,php,mysql,arrays,Javascript,Php,Mysql,Arrays,编辑:我以前试图简化它,但我想我会把它全部放在那里,因为它可能会消除一些关于我试图实现什么的困惑 我使用两个mySQL表创建一个javascript图表,在同一个图表上显示条形图和线形图。显示出勤情况的线形图和显示该日期酿造过程的条形图。 表A: 表B: id | name | brewdate | bottledate 1 | Honey Ale | 2015-01-14 | 2015-02-21 2 | IPA | 2015-01-14
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>
我遇到的问题是变量brewednames。它正确地给出了啤酒列表,空白处填充了没有酿造啤酒的日期,但它列出了在不同数组元素中具有相同日期的啤酒,我希望它们显示在同一个数组中。像这样:
var brewednames=["Honey Ale IPA","Porter","","Brown Ale","",""];
这背后的原因是,当用户将鼠标悬停在图表上相应的条形图上时,会显示此数组。因此,与其显示该日期酿造的啤酒数量,我希望它给出该日期酿造的所有啤酒的名称
我发现它可以帮助我在同一数组元素中对同一日期酿造的每种啤酒进行分组,但现在它们不是按照日期排序的,因为所有空格都已移动到数组的开头:
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 '",';
}
?>];
任何帮助都将不胜感激。此外,我确信我的代码并不完美,因为我正在自学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);
?>];
怪异更新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);
?>];
感谢@Alex提供的所有帮助,但在看到SQL select语句中包含的组_CONCAT()后,我尝试了另一种方法,用更少的代码获得了相同的结果
<?php
$sql = "SELECT TableA.date, GROUP_CONCAT(TableB.name) as gr_name
FROM TableB
RIGHT JOIN attendance
ON TableB.brewdate=TableA.date
GROUP BY TableA.date
ORDER BY TableA.date";
$names = $conn->query($sql);
?>
var namegroup=[<?php
while($info=mysqli_fetch_array($names)) {
echo '"' . $info['gr_name'] . '",';
}
?>];
为什么忽略$date
键?因为$values
保存要循环的数组。这与您的ORDER BY
子句有关。@PHPglue如果您查看代码,您会发现$values
只包含一个值$name
您在两个输出示例中的引号都有点奇怪。@Alex$info
是一个数组$date
是一个索引$values
是该索引处的值,它恰好是一个数组。然后将该数组循环,以$value
的形式接收其值。不管怎么说,您可能不应该使用日期作为数组索引。weirdArr是正确的。这看起来是一个很好的解决方案,但我真的不清楚OP的目的是什么。所以我暂且不谈+1。@Alex-这更干净了-但这似乎让我回到了我最初的问题,即每个名称都在一个单独的数组元素中。此外,名称必须在双引号内。请检查更新,并解释您的目标(如果有)。发布预期结果。@Alex-您的更新解决了双引号问题,但没有解决目标问题。请注意,蜂蜜麦芽酒和IPA在表B的“brewdate”列下的日期是如何相同的。我希望它们在同一数组元素中,所以不是var brewednames=[“Honey-Ale”,“IPA”,…]而是var brewednames=[“Honey-Ale-IPA”,…]所以我已经问过你你的目标是什么了!?给我看看预期的结果
<?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);
?>];
echo '"'.implode('","',$weirdArr).'"';
<?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);
?>];
<?php
$sql = "SELECT TableA.date, GROUP_CONCAT(TableB.name) as gr_name
FROM TableB
RIGHT JOIN attendance
ON TableB.brewdate=TableA.date
GROUP BY TableA.date
ORDER BY TableA.date";
$names = $conn->query($sql);
?>
var namegroup=[<?php
while($info=mysqli_fetch_array($names)) {
echo '"' . $info['gr_name'] . '",';
}
?>];
var namegroup=["Honey Ale, IPA","Porter","","Brown Ale","",""];