如何根据数据库值创建动态数量的数据集
How to create a dynamic number of datasets based on DB values
我的目标是使用 CanvasJS 在 PHP 中呈现一个图形,但使用基于数据库中的值动态生成的多个数据集。仅使用 1 个数据集生成此图效果很好,使其“动态”似乎是一个挑战。
对于 1 个数据集,我使用了以下代码:
while ($row = $stm->fetch(PDO::FETCH_ASSOC)) {
$score = calculateScore($row['difficulty'],$row['length']);
array_push($dataPoint, array("x"=> $i , "y"=> $score));
$i++;
}
其中$dataPoint发送给JS代码
<script type="text/javascript">
$(function () {
var chart = new CanvasJS.Chart("chartContainer", {
data: [
{
type: "line",
dataPoints: <?php echo json_encode($dataPoint, JSON_NUMERIC_CHECK); ?>
}
]
});
chart.render();
});
</script>
到目前为止,一切顺利,下一步是将其扩展到多个数据集。在这种情况下,对于视图“completedgames”中的每个用户,我们将创建一个新数据集 $datapoint,每个 $datapoint 将添加到总体数据集 $datapoints 中,如下所示:
while($rowUsers = $stmUsers->fetch(PDO::FETCH_ASSOC)){
$name = $rowUsers['username'];
$stm = $pdo->prepare('SELECT * FROM public."completedgames" WHERE username = :username');
$stm->bindParam(":username", $name, PDO::PARAM_INT);
$stm->execute();
while ($row = $stm->fetch(PDO::FETCH_ASSOC)) {
$score = calculateScore($row['difficulty'],$row['length']);
array_push($dataPoint, array("x"=> $i , "y"=> $score));
$i++;
}
array_push($dataPoints, $dataPoint);
$dataPoint = array();
}
其中 $dataPoints 是现在发送到与上面所示相同的 JS 代码的值。不幸的是,这就是它出错的地方。 data array_push() 函数感觉不对,但我不知道替代方法是什么。
所以,我希望这是足够的信息,欢迎所有信息,并提前致谢!
你有几个不同的问题,首先在附加数据时我会这样做:
$dataPoint[] = array("x"=> $i , "y"=> $score);
此外,我会摆脱它,因为它似乎正在清除 $dataPoint
并且实际上可能会在数组中创建额外的级别。
array_push($dataPoints, $dataPoint);
$dataPoint = array();
此代码创建一个 $charts
变量,它看起来像 javascript 图表定义中的 data
数组,而不是仅表示 dataPoints
数组。那应该允许您拥有任意数量的数据集。
$charts = [];
while($rowUsers = $stmUsers->fetch(PDO::FETCH_ASSOC)){
$dataPoint = [];
$name = $rowUsers['username'];
$stm = $pdo->prepare('SELECT * FROM public."completedgames" WHERE username = :username');
$stm->bindParam(":username", $name, PDO::PARAM_INT);
$stm->execute();
while ($row = $stm->fetch(PDO::FETCH_ASSOC)) {
$score = calculateScore($row['difficulty'],$row['length']);
array_push($dataPoint, array("x"=> $i , "y"=> $score));
$i++;
}
array_push($charts, array(
"type" => "line",
"dataPoints" => $dataPoint
));
}
<script type="text/javascript">
$(function () {
var chart = new CanvasJS.Chart("chartContainer", {
data: <?php echo json_encode($charts, JSON_NUMERIC_CHECK); ?>
});
chart.render();
});
</script>
使用 James 的输入,我能够制作多行图表。只需要重置计数器和 $dataPoint 数组:这是工作代码:
while($rowUsers = $stmUsers->fetch(PDO::FETCH_ASSOC)){
$name = $rowUsers['username'];
$stm = $pdo->prepare('SELECT * FROM public."completedgames" WHERE username = :username');
$stm->bindParam(":username", $name, PDO::PARAM_INT);
$stm->execute();
while ($row = $stm->fetch(PDO::FETCH_ASSOC)) {
$score = calculateScore($row['difficulty'],$row['length']);
array_push($dataPoint, array("x"=> $i , "y"=> $score));
json_encode($dataPoint, JSON_NUMERIC_CHECK);
$i++;
}
//array_push($dataPoints, $dataPoint);
// $dataPoint = array();
array_push($charts, array("type" => "line", "dataPoints" => $dataPoint));
$dataPoint = array();
$i = 0;
}
感谢您的所有意见!
我的目标是使用 CanvasJS 在 PHP 中呈现一个图形,但使用基于数据库中的值动态生成的多个数据集。仅使用 1 个数据集生成此图效果很好,使其“动态”似乎是一个挑战。
对于 1 个数据集,我使用了以下代码:
while ($row = $stm->fetch(PDO::FETCH_ASSOC)) {
$score = calculateScore($row['difficulty'],$row['length']);
array_push($dataPoint, array("x"=> $i , "y"=> $score));
$i++;
}
其中$dataPoint发送给JS代码
<script type="text/javascript">
$(function () {
var chart = new CanvasJS.Chart("chartContainer", {
data: [
{
type: "line",
dataPoints: <?php echo json_encode($dataPoint, JSON_NUMERIC_CHECK); ?>
}
]
});
chart.render();
});
</script>
到目前为止,一切顺利,下一步是将其扩展到多个数据集。在这种情况下,对于视图“completedgames”中的每个用户,我们将创建一个新数据集 $datapoint,每个 $datapoint 将添加到总体数据集 $datapoints 中,如下所示:
while($rowUsers = $stmUsers->fetch(PDO::FETCH_ASSOC)){
$name = $rowUsers['username'];
$stm = $pdo->prepare('SELECT * FROM public."completedgames" WHERE username = :username');
$stm->bindParam(":username", $name, PDO::PARAM_INT);
$stm->execute();
while ($row = $stm->fetch(PDO::FETCH_ASSOC)) {
$score = calculateScore($row['difficulty'],$row['length']);
array_push($dataPoint, array("x"=> $i , "y"=> $score));
$i++;
}
array_push($dataPoints, $dataPoint);
$dataPoint = array();
}
其中 $dataPoints 是现在发送到与上面所示相同的 JS 代码的值。不幸的是,这就是它出错的地方。 data array_push() 函数感觉不对,但我不知道替代方法是什么。
所以,我希望这是足够的信息,欢迎所有信息,并提前致谢!
你有几个不同的问题,首先在附加数据时我会这样做:
$dataPoint[] = array("x"=> $i , "y"=> $score);
此外,我会摆脱它,因为它似乎正在清除 $dataPoint
并且实际上可能会在数组中创建额外的级别。
array_push($dataPoints, $dataPoint);
$dataPoint = array();
此代码创建一个 $charts
变量,它看起来像 javascript 图表定义中的 data
数组,而不是仅表示 dataPoints
数组。那应该允许您拥有任意数量的数据集。
$charts = [];
while($rowUsers = $stmUsers->fetch(PDO::FETCH_ASSOC)){
$dataPoint = [];
$name = $rowUsers['username'];
$stm = $pdo->prepare('SELECT * FROM public."completedgames" WHERE username = :username');
$stm->bindParam(":username", $name, PDO::PARAM_INT);
$stm->execute();
while ($row = $stm->fetch(PDO::FETCH_ASSOC)) {
$score = calculateScore($row['difficulty'],$row['length']);
array_push($dataPoint, array("x"=> $i , "y"=> $score));
$i++;
}
array_push($charts, array(
"type" => "line",
"dataPoints" => $dataPoint
));
}
<script type="text/javascript">
$(function () {
var chart = new CanvasJS.Chart("chartContainer", {
data: <?php echo json_encode($charts, JSON_NUMERIC_CHECK); ?>
});
chart.render();
});
</script>
使用 James 的输入,我能够制作多行图表。只需要重置计数器和 $dataPoint 数组:这是工作代码:
while($rowUsers = $stmUsers->fetch(PDO::FETCH_ASSOC)){
$name = $rowUsers['username'];
$stm = $pdo->prepare('SELECT * FROM public."completedgames" WHERE username = :username');
$stm->bindParam(":username", $name, PDO::PARAM_INT);
$stm->execute();
while ($row = $stm->fetch(PDO::FETCH_ASSOC)) {
$score = calculateScore($row['difficulty'],$row['length']);
array_push($dataPoint, array("x"=> $i , "y"=> $score));
json_encode($dataPoint, JSON_NUMERIC_CHECK);
$i++;
}
//array_push($dataPoints, $dataPoint);
// $dataPoint = array();
array_push($charts, array("type" => "line", "dataPoints" => $dataPoint));
$dataPoint = array();
$i = 0;
}
感谢您的所有意见!