【问题标题】:Format data for Google Charts in PHP用 PHP 格式化 Google 图表的数据
【发布时间】:2020-07-02 12:50:11
【问题描述】:

我正在从 Google Charts 准备数据,但无法为 Google Charts 创建格式化数据数组。

我有这种格式的对象数组:

[
    {
        "total_amount": 6572.67,
        "o_date": "2020-06-01",
        "storeName": "Store1"
    },
    {
        "total_amount": 314.21,
        "o_date": "2020-06-01",
        "storeName": "Store2"
    },
    {
        "total_amount": 5550.34,
        "o_date": "2020-06-02",
        "storeName": "Store1"
    },
    {
        "total_amount": 461.87,
        "o_date": "2020-06-02",
        "storeName": "Store2"
    },
    {
        "total_amount": 6471.37,
        "o_date": "2020-06-03",
        "storeName": "Store1"
    },
    {
        "total_amount": 547.99,
        "o_date": "2020-06-03",
        "storeName": "Store2"
    },
]

Google Chart 需要这种格式的数据:

['Store', 'Store1', 'Store2', { role: 'annotation' } ],
['2020-06-01', 6572.67, 314.21, ''],
['2020-06-02', 5550.34, 461.87, ''],
['2020-06-03', 6471.37, 547.99, '']

我尝试了不同的方法在 foreach 循环中创建新数组,但无法格式化数组。 谁能建议我正确的方法? 谢谢。

更新

谢谢大家的cmets和答案。

是的,我正在使用 PHP/Laravel。

要从数据库中获取订单,我的查询是:

$orders =   $orders->select(DB::raw('SUM(orders.quantity) as total_quantity'), DB::raw('SUM(orders.totalAmount) as total_amount'), DB::raw('count(orders.id) as count'), DB::raw("DATE_FORMAT(date, '%Y-%m-%d') as o_date"), 'storeName')->groupBy('o_date', 'storeName')->get()->toArray();

上面的查询返回上面提到的对象数组。比我使用 foreach 循环提取的唯一日期。

foreach($orders as $order)
{
    if(!in_array($order->o_date, $dates))
    {
        array_push($dates, $order->o_date);
    }
}

然后我像这样遍历所有日期

foreach($dates as $date)
{
    $dataArray[] = [$date];

    foreach($orders as $order)
    {
        if($order->storeName == $store && $order->o_date == $date)
        {
            $dataArray[] = [$date, $order->total_amount];

        }
    }
}

上面的代码是错误的。数组中的第一个元素应该是 date,第二个元素应该是 total_amount for store1,第三个元素应该是 total_amount for store2,如下所示

['2020-06-01', 6572.67, 314.21, ''],
['2020-06-02', 5550.34, 461.87, ''],
['2020-06-03', 6471.37, 547.99, '']

注意:- 我正在为Google Stacked Column Chart准备数据

【问题讨论】:

  • 好的,那么你是如何像你一样格式化数据的,你是用 PHP 做的吗?如果是这样,请告诉我们
  • 请展示您的尝试并描述出了什么问题。那么至少我们有一个起点,可以尝试修复它。
  • 此外,您的数据与您声称的 Google 想要的数据不同
  • 我认为 OP 知道 @KunalRaut 问题是关于以特定 JSON 格式获取数据,而 OP 未能实现这一点
  • 请给我们看代码

标签: php laravel


【解决方案1】:

有点杂乱无章,但这应该可以。 $chart 变量将保存您要查找的内容。

    // Assuming data is the "array for object in this format"
    $dates = array_reduce($data, function ($dates, $record) {
        if (!in_array($record['o_date']), $dates) {
            $dates[] = $record['o_date'];
        }

        return $dates;
    }, []);

    $stores = array_reduce($data, function ($stores, $record) {
        if (!in_array($record['storeName'], $stores)) {        
            $stores[] = $record['storeName'];
        }

        return $stores;
    }, []);
    
    $headers = $stores;
    $headers[] = [ 'role' => 'annotation' ])

    $chart = [ $headers ];

    foreach ($dates as $date) {
        $datapoint = [ $date ];

        foreach ($stores as $store) {
            $total = 0;

            foreach ($data as $record) {
                $isStore = $record['storeName'] === $store;
                $isDate = $record['o_date'] === $date;
                if($isStore && $isDate) {
                    $total += (float) $record['total_amount'];
               }
            }

            $datapoint[] = $total;
        }
            
        $chart[] = $datapoint;
    }

【讨论】:

  • { role: 'annotation' } 将在 $chart 编码为 JSON 时进行双重编码。 ['Store', 'Store1', 'Store2', array("role" => "annotation") ] 将是在 PHP 中表达结构的正确方式。
  • @KunalRaut 是什么让这段代码产生静态值,你觉得呢?它从原始数据数组中读取它们。
  • 这个['Store', 'Store1', 'Store2', [ role => 'annotation' ] ] 看起来一点也不动态
  • @ADyson 这些值存储在数组中,storeName 看看它们一次。
  • @KunalRaut 你是在专门谈论标题行吗?我明白了,从您之前的评论中并不清楚。我会将它们视为“标题”而不是“价值”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-07
  • 2015-11-04
  • 2014-07-19
  • 1970-01-01
  • 2020-04-07
  • 2012-03-17
相关资源
最近更新 更多