如何根据数据库值创建动态数量的数据集

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;
    }  

感谢您的所有意见!