【问题标题】:Highcharts returning error 15 but the graph is correct?Highcharts 返回错误 15 但图表正确?
【发布时间】:2013-01-13 17:43:17
【问题描述】:

我已经在这几个小时了,我不知道出了什么问题。它显示正确的图表,但我无法将鼠标悬停在任何点上。我已经阅读了我的 var_dump() 并且我的所有记录都井井有条。我是否在某些时候错误地转换了日期?

我的图表是什么样的(正确的):http://screencloud.net/v/qrSS

我得到的错误:“Highcharts 错误 #15: www.highcharts.com/errors/15”

Highcharts 期望数据被排序

当您尝试创建数据未按 X 升序排序的线系列或股票图表时,会发生这种情况。出于性能原因,Highcharts 不对数据进行排序,而是要求实现者对数据进行预排序。

我的控制台:http://screencloud.net/v/qWHo

我的 highcharts 代码

        $.post('/card/read_graph_json', inputs, function(data) {
            json = jQuery.parseJSON(data);

            chart = new Highcharts.Chart({
                chart: {
                    renderTo: 'container',
                    type: 'spline'
                },
                global: {
                    useUTC: false
                },
                plotOptions: {
                    series: {
                        animation: false
                    }
                },
                title: {
                    text: '{{ $card->name }}'
                },
                subtitle: {
                    text: null
                },
                xAxis: {
                    type: 'datetime',
                    dateTimeLabelFormats: { // don't display the dummy year
                        month: '%b',
                        year: '%b'
                    }
                },
                yAxis: {
                    title: {
                        text: null
                    },
                },
                tooltip: {
                    formatter: function() {
                        var monthNames = [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ],
                            date = new Date(this.x);

                        return '<strong>'+ this.series.name +'</strong><br/>'+ monthNames[date.getMonth()] + '. ' + date.getDay() + ', ' + date.getFullYear() +': '+ this.y;
                    }
                },
                series: [json]
            });
        });

创建 JSON 的我的 php

public function contact_records($contact_id, $number_past_entries = 6, $reverse = false) 
{
        // Pull 15 records from db and order them by date created "Y-m-d H:i:s" 
        return $this->has_many('Record')
            ->where_deleted(0)
            ->where_contact_id($contact_id)
            ->order_by('created_at', 'desc')
            ->take($number_past_entries)
            ->get();
}

public function post_read_graph_json()
{
    $contact_id = Input::get('contact_id');
    $tracker = Tracker::find(Input::get('tracker_id'));
    $card = Card::find(Input::get('card_id'));
    $serie = array();

    if ($tracker != null && $card != null) {
        Cookie::forever("default_graph_tracker_id", $tracker->id);
        $data = array();

        // This is where my records come from
        $records = $card->contact_records($contact_id, 15);

        // Create the serie
        foreach ($records as $record) {
            $data[] = array(
                strtotime($record->created_at) * 1000,
                floatval($record->read_tracker_value($tracker->id)->value)
            );
        }

        $serie = array(
            'name' => $tracker->name,
            'data' => $data
        );
    }

    return json_encode($serie);
}

【问题讨论】:

    标签: php javascript graph highcharts


    【解决方案1】:

    我用过这个功能

    function aasort (&$array, $key) {
        $sorter=array();
        $ret=array();
        reset($array);
        foreach ($array as $ii => $va) {
            $sorter[$ii]=$va[$key];
        }
        asort($sorter);
        foreach ($sorter as $ii => $va) {
            $ret[$ii]=$array[$ii];
        }
        $array=$ret;
    }
    

    更新了我的代码的一部分

            $data = array();
            foreach ($records as $record) {
                $data[] = array(
                    'time' => strtotime($record->created_at) * 1000,
                    'value' => floatval($record->read_tracker_value($tracker->id)->value)
                );
            }
    
            aasort($data, 'time');
    
            $new_data = array();
            foreach ($data as $record) {
                $new_data[] = array(
                    $record['time'],
                    $record['value']
                );
            }
    
            $serie = array(
                'name' => $tracker->name,
                'data' => $new_data
            );
    

    哒哒!

    【讨论】:

    • 这不是那么容易,如果你能避免排序就更好了,排序不是一个便宜的操作,它相当耗费时间。如果您有大型数据结构,您显然会降低性能。
    • 这个选项还不错,它在服务器端排序也比在客户端排序好。如果您的数据集很大,请将其分成几部分。答案很好。此外,如果您想避免排序,只需抑制错误。
    猜你喜欢
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-11
    • 1970-01-01
    • 2011-03-27
    • 2014-07-31
    • 2014-04-19
    相关资源
    最近更新 更多