在Javascript甜甜圈图的PHP变量中引用PHP变量

Quoting PHP Variable inside PHP Variable for Javascript Donut Chart

本文关键字:PHP 变量 引用 Javascript 甜甜圈      更新时间:2023-09-26

我今天遇到了一点困难,要把一些PHP变量传递给Javascript来制作Donut图。我已经搞了很长一段时间了,还没能弄清楚,我已经查看了这里的帖子以及大量的谷歌搜索,但还没能找到答案。以下是我正在努力实现的目标:

我正试图将数据从MySQL推送到Javascript Donut图表中,以供特定PHP页面的web引用者使用。Javascript图表的语法如下:

<script>
Morris.Donut({
element: 'css div',
data: 
[
{ label: '<?php echo($graph["referrer"]); ?>', value: '<?php echo($graph["chart"]); ?>' },
] 
});
</script>

$graph['referre']变量保存引用者名称,如"Google.com",$graph['count']变量将引用者名称的相应记录计数保存为数字,如"5"。

以"{label"开头的Javascript行表示Donut图的一部分。最初,从MySQL中提取的数据是用fetchArray()完成的,我想做的是使用PHP foreach语句(例如foreach($Array作为$graph))生成每个"{label"行,这样就可以根据fetchArray()返回的引用者名称的数量动态生成图。我已经尝试了几乎所有我能想到的方法来实现这一点——将整个Javascript行存储在PHP中,然后将其回显到Javascript,等等。但这总是会导致PHP出现内部错误。

我相信答案就在我眼皮底下,谢谢大家抽出时间。

使用json_encode()生成一个干净的数据对象:

在PHP中:

$data = array( array( 'label' => $graph["referrer"] ), 'value' => $graph["chart"] ) );

在您的JavaScript中;

data: <?php echo json_encode($data); ?>

将php变量数组传递给js脚本的正确方法是使用json。以下是您需要做的:

php部分:

$sql = 'select * from ....';    // your query
// execute query
// as I don't know what mysql api do you use, 
// it's kinda pseudo-code
// but the main idea is to get all rows 
// you need in one array `$graphs`
$graphs = array();
while ($graph = fetch_array()) {
    $graphs[] = array(
        'label' => $graph["referrer"],
        'value' => $graph["chart"],
    );
}

js部分:

<script>
Morris.Donut({
    element: 'css div',
    data: <?php echo json_encode($graphs); ?>
});
</script>

您根本没有循环$graph变量。它只有一个:

<script>
  Morris.Donut({
    element: 'css div',
    data: [{
      label: '<?php echo($graph["referrer"]); ?>',
      value: '<?php echo($graph["chart"]); ?>'
    },]
  });
</script>

上面的代码将只呈现一个变量。我相信,你应该在这里有某种循环:

<script>
  Morris.Donut({
    element: 'css div',
    data: [
<?php foreach (/* some loop */) { ?>
      {
        label: '<?php echo($graph["referrer"]); ?>',
        value: '<?php echo($graph["chart"]); ?>'
      },
<?php } ?>
    ]
  });
</script>

或者最好的方法是使用数组和json_encode()来输出JSON。

我的最终解决方案是将字符串连接在一个又大又丑但能工作的glob中。

<script>
Morris.Donut({
element: 'graph div'
data: {
<?php foreach($multidimarray as $graph): ?>
    <?php echo htmlspecialchars("{label: "."'".$graph['referrer']."'".", value: "."'".$graph['count']."'"." }, "); ?>
<?php endforeach; ?>
]
});
</script>

返回为:{标签:"Facebook",值:"2"},{label:"Direct",值:"2"},{标签:"Microsoft",值:"1"},{label:"Ask.com",值:"1"},{标签:"Google",值:"1"},

再次感谢大家的帮助,尽管我不理解他们,但我感谢大家的回答。我将标记Gerald的回答,因为他首先做出了回应,首先提到了json_encode,并使我最接近期望的结果。