PHP usort()或Carbon返回错误排序的数组

时间:2017-04-20 15:11:24

标签: php arrays charts google-visualization

我有一个项目使用Google Charts Line Graph API来生成日期与数字的图表。

我正在通过Ajax将PHP脚本中的数组传送到Google Chart。

这一切都有效,但数据中偶尔会出现......奇怪......谷歌图表似乎会自行循环。

Dates March 30 is looping back

我认为这是因为Google Charts依赖于它收到的JSON数组的顺序(无论日期如何)。所以我试图在用PHP发送它之前按日期对这个数组进行排序。我在usort()中使用了一个函数来实现这一点,并使用Carbon extension来比较日期。

// Sort by Date
usort(
    $rows,
    function ($a, $b) {
        // 'date' Index in $row array
        $date = 0;

        // Match for anything within Brackets (only match should be 'Date(xxx)' column of $row);
        preg_match('#\((.*?)\)#', $a[$date], $a_matches);
        preg_match('#\((.*?)\)#', $b[$date], $b_matches);

        // If $a and $b contain Dates (as assumed by above) ie. not header/information rows
        if (isset($a_matches[1]) && isset($b_matches[1])) {
            // Convert the strings to Dates and increase
            $a_date = Carbon::parse(str_replace(', ', '-', $a_matches[1]))->addMonth();
            $b_date = Carbon::parse(str_replace(', ', '-', $b_matches[1]))->addMonth();

            // If $a less than $b, return -1 (reduce $a in order) otherwise 1 (promote $a in order)
            if ($a_date->lt($b_date)) return -1;
            else return 1;
        }

        // Else return 0 (no change in order)
        return 0;
    }
);

return $rows;

然而,这是返回一个数组,否则99%正确,包括如下情况: 2017-03-282017-03-292017-04-012017-03-302017-04-022017-03-312017-04-03并返回正常排序。

这是Google图表返回的数组:

array returned via ajax

有谁知道为什么会发生这种情况?

1 个答案:

答案 0 :(得分:2)

而不是对数组数据进行排序,可能更容易在绘制之前对Google数据表进行排序...

{{1}}