【问题标题】:Generate nested json format like nvd3 StackAreaChart data生成嵌套的 json 格式,如 nvd3 StackAreaChart 数据
【发布时间】:2016-04-29 02:59:05
【问题描述】:

我正在尝试生成一个嵌套的 jsonnvd3 StackedAreaChart 使用:

    [
        {
            "key" : "North America" ,
            "values" : [ [ 1025409600000 , 23.041422681023] , [ 1028088000000 , 19.854291255832] ]

        },

        {
            "key" : "Africa" ,
            "values" : [ [ 1025409600000 , 7.9356392949025] , [ 1028088000000 , 7.4514668527298] ]

        },

    ]

来源:http://plnkr.co/edit/CIGW0o?p=preview

我想使用我的数据库中的数据。

我怎样才能达到那种json?我对嵌套的json 不太熟悉,而且我在json 的结构中注意到的一件事是values 对象中的值是纯整数。它不像"1025409600000" 那样被引用。当我尝试引用它时,图表无法正确读取数据。

问题

  1. 如何产生嵌套的jsonnvd3 使用?我已经进行了一些研究,但没有任何反应。我发现了一些我猜它会的东西,但无法让它工作。 Here 和这个one 也是。

  2. 是否可以 unquote 嵌套 json 结构中的值?如果是,怎么做?

这是我目前正在做的事情:

        <?php

        require_once('conn.php');

        $sql = "SELECT ua.user_id,(UNIX_TIMESTAMP(dt.transac_date)*1000) AS transac_date,
                        CONCAT(ui.fname,' ',ui.lname) AS fullname,
                        SUM((dt.item_price - dt.item_srp) * dt.sold) as profit,
                        SUM((dt.item_price) * dt.sold) as total_sales
                FROM dsp_transactions dt
                INNER JOIN user_acct ua ON dt.user_id=ua.user_id
                INNER JOIN user_info ui ON ua.ui_id=ui.ui_id
                GROUP BY ua.user_id";
        $qry = $con->query($sql);

        $data = array();
        if($qry->num_rows > 0) {
            while($row = $qry->fetch_object()) {
                $data[] = array(

                    'key' => $row->fullname,
                    'values' => $row->user_id

                    );
            }
        } else {
            $data[] = null;
        }

        $con->close();

        echo json_encode($data);

        ?>

这给了我这个价值:

[{"key":"Juan Dela Cruz","values":["1461772800000","5665.00"]},{"key":"Maria Gonzales","values":["1461772800000","275.00"]},{"key":"Apolinario Mabini","values":["1461772800000","100.00"]}]

提前致谢:)

编辑

有关更多信息,我希望发生这样的事情:

         dsp      |    sales     |   profit    |     date    
    --------------+--------------+-------------+--------------
        Juan      |    500       |     100     |    04/24/2016
    --------------+--------------+-------------+--------------
        Maria     |    600       |     200     |    04/24/2016
    --------------+--------------+-------------+--------------
       Apolinario |    700       |     300     |    04/24/2016
    --------------+--------------+-------------+--------------
        Juan      |    550       |     150     |    04/25/2016

会以json 格式返回

    [
        {
            "key" : "Juan",
            "values" : [ ["04/24/2016", "500"], ["04/25/2016", "550"] ]  // "values" loop twice because "juan" has two sales

        },
        {
            "key" : "Maria",
            "values" : [ ["04/24/2016", "600"] ]

        },
        {
            "key" : "Apolinario",
            "values" : [ ["04/24/2016", "700"] ]

        }
    ]

【问题讨论】:

    标签: javascript php json nvd3.js angular-nvd3


    【解决方案1】:

    返回的用户 id 将被转换为字符串。您可以使用 php 将它们转换回浮点数:

    【讨论】:

    • doubleval() 函数有效!谢谢。但是嵌套的 json 呢?
    【解决方案2】:

    我认为问题在于您如何处理查询返回的数据。据我了解这个问题,您想对每个人的所有交易日期和销售额(或利润)进行分组。因此,您需要在对数组进行编码之前对其进行操作。

    看看这个 sn-p 是否运行,如果发生错误,请告诉我,但基本上,这是我看到的解决问题的逻辑:

    <?php
    
    require_once('conn.php');
    
    $sql = "SELECT ua.user_id,(UNIX_TIMESTAMP(dt.transac_date)*1000) AS transac_date,
                    CONCAT(ui.fname,' ',ui.lname) AS fullname,
                    SUM((dt.item_price - dt.item_srp) * dt.sold) as profit,
                    SUM((dt.item_price) * dt.sold) as total_sales
            FROM dsp_transactions dt
            INNER JOIN user_acct ua ON dt.user_id=ua.user_id
            INNER JOIN user_info ui ON ua.ui_id=ui.ui_id
            GROUP BY transac_date, ua.user_id";
    $qry = $con->query($sql);
    
    $data = array();
    $individual_row = array();
    if($qry->num_rows > 0) 
    {
        while($row = pg_fetch_object($qry)) {
            //we find if there is an existing row with the person
            $indexOfIndividualRow = array_search($row->dsp, array_column($data, 'key'));
            //if no rows of the person are added yet
            if(empty($indexOfIndividualRow)&& !is_numeric($indexOfIndividualRow))
            {
                $individual_row['key'] = $row->dsp;
                $individual_row['values'] = array(array($row->date, $row->sales));
                array_push($data, $individual_row);
            }
            //if there is a row with person as key
            else 
            {
                //if there is a 'values' key
                if(isset($data[$indexOfIndividualRow]['values'])){
                    array_push($data[$indexOfIndividualRow]['values'], array($row->date, $row->sales));
                }
                //else if there is no 'values' key
                else $data[$indexOfIndividualRow]['values'] = array($row->date, $row->sales);
            }
        }
    }
    else {
        $data[] = null;
    }
    
    $con->close();
    
    echo json_encode($data);
    ?>
    

    【讨论】:

    • 你试过我的代码了吗?我认为这就是我的解决方案旨在输出的内容。
    • 是的。我刚试过。但只返回values 中的第一个循环。我认为这是因为我的query 只得到user's id 而我使用了GROUP BY。它没有得到“胡安”的两个日期。知道如何用您的代码修复我的query 吗?我已经尝试了任何方法来满足您的代码的输出,但无法使其正常工作。
    • 您应该尝试将查询中的GROUP BY ua.user_id 子句更改为GROUP BY transac_date, ua.user_id。这样您就可以获得每个日期的销售额,而不仅仅是个人。请参阅上面的编辑。尝试运行它。
    • 它只是在第一个对象中循环数据两次。 [{"key":"Juan Dela Cruz","values":["1461772800000","5115.00"]},{"key":"Maria Gonzales","values":["1461772800000","275.00"] },{"key":"Apolinario Mabini","values":["1461772800000","100.00"]},{"key":"Juan Dela Cruz","values":["1461859200000","550.00" ]}]
    • 嗨!我解决了它.. :) 如果条件和“值”键初始化已更改。请参考编辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-16
    • 1970-01-01
    相关资源
    最近更新 更多