【问题标题】:How can i pass a JSON array from php to JS?如何将 JSON 数组从 php 传递给 JS?
【发布时间】:2017-08-16 22:35:25
【问题描述】:

我试图从一组结果中填充 morris.js 图表。在我的控制器中,我创建了一个结果数组并使用 json_encode 创建一个 json 数组,这是使用 print_r 在我的视图中的输出:

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

如何将此数据传递给我的 morris.js 图表以使用此数据作为标签/值对来填充图表?我尝试的每件事都会得到一个空白图表或“未定义”变量或“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);
}

还有我的 morris.js:

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

非常感谢任何帮助

【问题讨论】:

  • 你是如何加载你的morris.js的?如果您使用 HTML 中的脚本标记执行此操作,则 php 服务器不会解析该文件。
  • 我的脚本已加载到我的页脚中

标签: javascript php codeigniter morris.js


【解决方案1】:

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

您需要:

  • morris.js脚本内容放在一个javascript块中的php页面中,以便解析php;
  • 从您的 morris.js 脚本发出 ajax 请求,以在单独的请求中从服务器获取数据;
  • 设置您的服务器以解析 .js 文件,就好像它们是/包含 php。

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

【讨论】:

  • 另一种方法是在 php 文件中使用嵌入的脚本标签来仅填充一个全局变量,该变量可以稍后在 morris.js 文件中使用,这就是我可能会使用的。
  • @xander 你说得对,我可能也会这样做,但我不知道morris.js 所以为了避免一个接一个地加载,导致新的问题,我没有提一下。而且只有几行:-)
  • 我将如何处理 AJAX 请求?我有点菜鸟,因为我已经离开这个领域大约 9 年了!谢谢
  • @jeroen 是否可以在您的答案中将标签字符串“剪辑”为 3 个字符?例如,对于某些图表,我希望标签最多包含 3 个字符?这可能吗?例如:“正”会变成“正”吗?干杯
【解决方案2】:

在 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 )
});

查看 morris.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
});

【讨论】:

  • 尝试了所有 3 个都没有运气 :( 被困在这一整天了!感谢您的尝试
  • 不要被卡住。如果你想回答你的问题,你会得到什么样的错误?你在期待什么?我不知道其他人,但我不是读心术。我不确定您期望 {data} 是什么。如果您希望数据包含一个 js 对象,该对象是您的 json 编码图表数据的内容,这就是我要为您做的事情。
  • 抱歉,我将一组结果作为数组传递,我需要将数组转换为标签:值对。例如标签:“正”,值:7,但我尝试过的一切要么导致没有显示图表,要么我得到一个带有非数字(NaN)值的标签,(很少有 javascript 经验),我没有得到任何错误。感谢您的帮助,非常感谢
  • 在我的最后一个示例中,只要您对隐藏输入的 value 属性使用单引号,当您查看页面源时,您应该会在该值中看到您的 json 字符串。你在使用 jQuery 吗?如果你是,并且使用我的上一个示例,那么 data 的值是一个 js 对象,在你的 Donut 方法中,你可以使用 param.data.Positive 找到“Positive”的值。您的 Donut 方法需要一个参数,因此如果 Donut 方法签名看起来像 Donut(x),那么“Positive”将是 x.data.Positive。如果不是,请尝试使用 console.log(x) 并告诉我您的控制台中有什么。
  • 早上好,使用您的最后一个示例,数据在隐藏的 div 中,但仍然没有显示图表,我在控制台上收到此错误:“语法错误:JSON.parse:行中的意外字符2 JSON 数据的第 1 列”我的结果来自我的搜索模型中的 SQL 查询。再次感谢**更新**摆脱了那个错误,我现在在控制台日志中没有错误,但也没有显示图表
猜你喜欢
  • 2018-02-02
  • 2017-09-03
  • 2018-09-25
  • 2021-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多