在ChartJS和PHP中分组数据

在ChartJS和PHP中分组数据,php,arrays,sorting,graph,charts,Php,Arrays,Sorting,Graph,Charts,嗨,我有一个数据表,我正试图用ChartJS绘制一个图表。数据数组如下所示 Array ( [0] => Array ( [Sort] => 2 [Weeks] => 1-2 Weeks [Severity] => P1 [Count] => 7 ) [1] => Array (

嗨,我有一个数据表,我正试图用ChartJS绘制一个图表。数据数组如下所示

Array
(
    [0] => Array
        (
            [Sort] => 2
            [Weeks] => 1-2 Weeks
            [Severity] => P1
            [Count] => 7
        )

    [1] => Array
        (
            [Sort] => 2
            [Weeks] => 1-2 Weeks
            [Severity] => P2
            [Count] => 3
        )

    [2] => Array
        (
            [Sort] => 2
            [Weeks] => 1-2 Weeks
            [Severity] => P3
            [Count] => 4
        )

    [3] => Array
        (
            [Sort] => 2
            [Weeks] => 1-2 Weeks
            [Severity] => P4
            [Count] => 3
        )

    [4] => Array
        (
            [Sort] => 3
            [Weeks] => 2-3 weeks
            [Severity] => P1
            [Count] => 1
        )

    [5] => Array
        (
            [Sort] => 4
            [Weeks] => >4 weeks
            [Severity] => No Value
            [Count] => 1
        )

    [6] => Array
        (
            [Sort] => 4
            [Weeks] => >4 weeks
            [Severity] => P1
            [Count] => 1
        )

    [7] => Array
        (
            [Sort] => 4
            [Weeks] => >4 weeks
            [Severity] => P3
            [Count] => 1
        )

) 
Array
(
    [labels] => Array
        (
            [0] => >4 weeks
            [1] => 2-3 weeks
            [2] => 1-2 Weeks
        )

    [datasets] => Array
        (
            [0] => Array
                (
                    [label] => No Value
                    [backgroundColor] => #F00
                    [borderColor] => #F00
                    [borderWidth] => 1
                    [maxBarThickness] => 50
                    [data] => Array
                        (
                            [0] => 1
                        )

                )

            [1] => Array
                (
                    [label] => P1
                    [backgroundColor] => #84a4d4
                    [borderColor] => #84a4d4
                    [borderWidth] => 1
                    [maxBarThickness] => 50
                    [data] => Array
                        (
                            [0] => 1
                            [1] => 1
                            [2] => 7
                        )

                )

            [2] => Array
                (
                    [label] => P3
                    [backgroundColor] => #eb8d22
                    [borderColor] => #eb8d22
                    [borderWidth] => 1
                    [maxBarThickness] => 50
                    [data] => Array
                        (
                            [0] => 1
                            [1] => 4
                        )

                )

            [3] => Array
                (
                    [label] => P2
                    [backgroundColor] => #FBCEB1
                    [borderColor] => #FBCEB1
                    [borderWidth] => 1
                    [maxBarThickness] => 50
                    [data] => Array
                        (
                            [0] => 3
                        )

                )

            [4] => Array
                (
                    [label] => P4
                    [backgroundColor] => #7FFFD4
                    [borderColor] => #7FFFD4
                    [borderWidth] => 1
                    [maxBarThickness] => 50
                    [data] => Array
                        (
                            [0] => 3
                        )

                )

        )

)
我转换了与ChartJS兼容的数组,如下所示

Array
(
    [0] => Array
        (
            [Sort] => 2
            [Weeks] => 1-2 Weeks
            [Severity] => P1
            [Count] => 7
        )

    [1] => Array
        (
            [Sort] => 2
            [Weeks] => 1-2 Weeks
            [Severity] => P2
            [Count] => 3
        )

    [2] => Array
        (
            [Sort] => 2
            [Weeks] => 1-2 Weeks
            [Severity] => P3
            [Count] => 4
        )

    [3] => Array
        (
            [Sort] => 2
            [Weeks] => 1-2 Weeks
            [Severity] => P4
            [Count] => 3
        )

    [4] => Array
        (
            [Sort] => 3
            [Weeks] => 2-3 weeks
            [Severity] => P1
            [Count] => 1
        )

    [5] => Array
        (
            [Sort] => 4
            [Weeks] => >4 weeks
            [Severity] => No Value
            [Count] => 1
        )

    [6] => Array
        (
            [Sort] => 4
            [Weeks] => >4 weeks
            [Severity] => P1
            [Count] => 1
        )

    [7] => Array
        (
            [Sort] => 4
            [Weeks] => >4 weeks
            [Severity] => P3
            [Count] => 1
        )

) 
Array
(
    [labels] => Array
        (
            [0] => >4 weeks
            [1] => 2-3 weeks
            [2] => 1-2 Weeks
        )

    [datasets] => Array
        (
            [0] => Array
                (
                    [label] => No Value
                    [backgroundColor] => #F00
                    [borderColor] => #F00
                    [borderWidth] => 1
                    [maxBarThickness] => 50
                    [data] => Array
                        (
                            [0] => 1
                        )

                )

            [1] => Array
                (
                    [label] => P1
                    [backgroundColor] => #84a4d4
                    [borderColor] => #84a4d4
                    [borderWidth] => 1
                    [maxBarThickness] => 50
                    [data] => Array
                        (
                            [0] => 1
                            [1] => 1
                            [2] => 7
                        )

                )

            [2] => Array
                (
                    [label] => P3
                    [backgroundColor] => #eb8d22
                    [borderColor] => #eb8d22
                    [borderWidth] => 1
                    [maxBarThickness] => 50
                    [data] => Array
                        (
                            [0] => 1
                            [1] => 4
                        )

                )

            [3] => Array
                (
                    [label] => P2
                    [backgroundColor] => #FBCEB1
                    [borderColor] => #FBCEB1
                    [borderWidth] => 1
                    [maxBarThickness] => 50
                    [data] => Array
                        (
                            [0] => 3
                        )

                )

            [4] => Array
                (
                    [label] => P4
                    [backgroundColor] => #7FFFD4
                    [borderColor] => #7FFFD4
                    [borderWidth] => 1
                    [maxBarThickness] => 50
                    [data] => Array
                        (
                            [0] => 3
                        )

                )

        )

)
但当数据被绘制到图表上时,数据会被扰乱。数据是这样排列的

这是真实的数据以及图表应该是什么样子

这是我的密码

function chart(){
        $ar= RNCPHP\AnalyticsReport::fetch('Open tickets Ageing by priority');
        $arr= $ar->run(0, $filters);


        $chartInit  =   array();
        $chartArr['data']   =   array();

        // push the report data into an array
        for ( $ii = $arr->count(); $ii--; ) {
            $row = $arr->next();

            if($row['Severity'] == null || $row['Severity'] == "") {
                $row['Severity']    =   "No Value";
            }

            $row['Sort']    =   $row['Sort'];

            array_push($chartInit, $row);
        }
        echo "<pre>";
        print_r($chartInit);

        array_multisort(array_map(function($element) {
            return $element['Sort'];
        }, $chartInit), SORT_DESC, $chartInit);


        $chartDataArr   =   array();
        $sevArr =   array();

        foreach($chartInit as $k => $v) {
            if(!isset($chartDataArr[$v['Weeks']])) {
                $chartDataArr[$v['Weeks']]  =   array();
            }

            array_push($chartDataArr[$v['Weeks']], $v);

            if(!in_array($v['Severity'], $sevArr)) {
                array_push($sevArr, $v['Severity']);
            }
        }

        $mapLabels  =   array();

        $parsedAry  =   array();
        $parsedAry['labels']    =   array();
        $parsedAry['datasets']  =   array();

        for($i = 0; $i < count($sevArr); $i++) {
            $parsedAry['datasets'][$i]  =   array();

            $parsedAry['datasets'][$i]['label'] =   $sevArr[$i];
            $parsedAry['datasets'][$i]['backgroundColor']   =   $this->getColor($i);
            $parsedAry['datasets'][$i]['borderColor']   =   $this->getColor($i);
            $parsedAry['datasets'][$i]['borderWidth']   =   1;
            $parsedAry['datasets'][$i]['maxBarThickness']   =   50;

            $parsedAry['datasets'][$i]['data']  =   array();
        }

        foreach($chartDataArr as $k => $v) {
            array_push($parsedAry['labels'], $k);

            foreach($v as $k1 => $v1) {
                $keySev =   "";
                foreach($parsedAry['datasets'] as $k2 => $v2) {
                    if($v2['label'] == $v1['Severity']) {
                        $keySev =   $k2;
                    }
                }

                if($v1['Count'] == null || $v1['Count'] == "") {
                    $v1['Count']    =   0;
                }

                array_push($parsedAry['datasets'][$keySev]['data'], $v1['Count']);
            }
        }

        echo "<pre>";
        print_r($parsedAry);
        echo "</pre>";   

        $chartArr['data']   =   $parsedAry;

        return $chartArr;
    }
在我的视图页面中,我使用ChartJS函数显示数据


请帮助。

您的代码有几个问题

首先,您的数据集应该有大量的标签,这样您就不能忽略空白位置而不填充它们。要解决此问题,您需要进行更改 $parsedAry['dataset'][$i]['data']=array;到$parsedAry['datasets'][$i]['data']=array0,0,0,0

这将在您的数据集中添加5个空白点

第二,你必须把数字放在正确的位置,你必须为你的最后一个循环添加一个计数器来识别正确的位置

最后,您的代码应该是这样的


虽然代码太多,但我认为问题在于数组_push$parsedAry['datasets'][$keySev]['data'],$v1['Count'];,您需要执行类似于$parsedAry['datasets'][$keySev]['data'][$weekSlot]=$v1['Count']的操作。使用array_push只是从0添加项目,从标签中可以看到[0]=>>4周。非常感谢。我尝试了很多东西。这很有效。非常感谢。