代码之家  ›  专栏  ›  技术社区  ›  Sam

如何将JSON数组从php传递到JS?

  •  0
  • Sam  · 技术社区  · 7 年前

    {"Positive":7,"Negative":26,"Pending":786,"Contact the Clinic":242,"Misc":2} 
    

    我怎么把这个传给我的莫里斯。js chart是否使用此数据作为标签/值对填充图表?我尝试的每件事都会得到一个空白图表或一个“未定义”变量或“NaN”。这是我的控制器:

    function execute_search()
    {
        // Retrieve the posted search term.
        $search_term = $this->input->post('search');
    
        // Get results count and pass it as json:
        $data = $this->search_model->count_res('$p_results_data');
        $pos = 0; $neg= 0; $pen = 0; $cont = 0; $misc = 0;
        foreach ($data as $item) {
            if ($item['result'] === 'Positive') {
                $pos++;
            } elseif ($item['result'] === 'Negative') {
                $neg++;
            } elseif ($item['result'] === 'Pending') {
                $pen++;
            } elseif ($item['result'] === 'Contact the Clinic') {
                $cont++;
            } else {
                $misc++;
            }
        }
        $res = array("Positive"=>$pos, "Negative"=>$neg, "Pending"=>$pen, "Contact the Clinic"=>$cont, "Misc"=>$misc);
        $data = json_encode($res);
    
        // Use the model to retrieve results:
        $this->data['results'] = $this->search_model->get_results($search_term);
        $this->data['chart'] = $data;
        $this->data['totals'] = $this->search_model->total_res('$total_res');
    
        // Pass the results to the view.
        $this->data['subview'] = ('user/search_results');
        $this->load->view('_layout_admin', $this->data);
    }
    

    还有我的莫里斯。js:

    $results = "<?php echo $chart ?>";
    new Morris.Donut({
        element: 'donutEg',
        data: [
            $results
        ],
    });
    

    非常感谢您的帮助

    2 回复  |  直到 7 年前
        1
  •  2
  •   jeroen    7 年前

    假设您的 morris.js 是一个普通的javascript文件,默认情况下不能在那里使用php:服务器不会解析 .js 这样php源代码就会出现在javascript中。

    • 从您的 脚本以在单独的请求中从服务器获取数据;
    • 设置要解析的服务器

    最后一个只是为了说明您需要什么,我不建议您这样做。

        2
  •  1
  •   Brian Gottier    7 年前

    在javascript中,JSON。parse是您的朋友,假设您有由PHP的JSON_encode函数创建的JSON:

    $results = "<?php echo $chart ?>";
    new Morris.Donut({
        element: 'donutEg',
        data: [
            JSON.parse( $results )
        ],
    });
    

    $results = "<?php echo $chart ?>";
    new Morris.Donut({
        element: 'donutEg',
        data: JSON.parse( $results )
    });
    

    但是我做这件事的方式

    <input type="hidden" id="chartData" value='<?php echo $chart; ?>' />
    

    在JS中(使用jQuery):

    var chartData = $('#chartData').val();
    new Morris.Donut({
        element: 'donutEg',
        data: JSON.parse( chartData )
    });
    

    在查看了莫里斯的文档之后。js,我发现这就是你如何做正确的方式:

    // Looking at the docs for morris.js:
    // http://jsbin.com/ukaxod/144/embed?js,output
    
    // This is your data, but it's all in one json object
    var chartData = JSON.parse( $('#chartData').val() );
    
    // We need to break up that object into parts of the donut
    var donutParts = [];
    $.each( chartData, function(k,v){
        donutParts.push({
            label: k,
            value: v
        });
    });
    
    // Now create the donut
    Morris.Donut({
        element: 'donutEg',
        data: donutParts
    });