Javascript Google图表错误:给定的每一行必须为null或数组

Javascript Google图表错误:给定的每一行必须为null或数组,javascript,arrays,google-visualization,Javascript,Arrays,Google Visualization,我已经设置了一个GoogleCharts(OrgChart)实现,它接受行列表作为变量,最终来自PHP。如果我尝试使用该变量呈现组织结构图,我会得到错误“给定的每一行必须为null或数组”。如果我在执行addRows命令之前执行alert(userlist),复制该输出,并用输出替换该变量,一切正常,因此我知道它正确地接收了数据。以下是到目前为止我得到的信息: google.charts.load('current', {packages:["orgchart"]}); google.chart

我已经设置了一个GoogleCharts(OrgChart)实现,它接受行列表作为变量,最终来自PHP。如果我尝试使用该变量呈现组织结构图,我会得到错误“给定的每一行必须为null或数组”。如果我在执行
addRows
命令之前执行
alert(userlist)
,复制该输出,并用输出替换该变量,一切正常,因此我知道它正确地接收了数据。以下是到目前为止我得到的信息:

google.charts.load('current', {packages:["orgchart"]});
google.charts.setOnLoadCallback(drawChart);

function drawChart() {
  var data = new google.visualization.DataTable();
  data.addColumn('string', 'Name');
  data.addColumn('string', 'Manager');
  data.addColumn('string', 'ToolTip');

  // Pull user information from Drupal
  var userlist = Drupal.settings.orgchart.userlist;

  // For each orgchart box, provide the name, manager, and tooltip to show.
  alert(userlist);
  data.addRows([userlist]);

  // Create the chart.
  var chart = new google.visualization.OrgChart(document.getElementById('org-chart'));
  // Draw the chart, setting the allowHtml option to true for the tooltips.
  chart.draw(data, {allowHtml:true});
}
同样,如果我替换
data.addRows([userlist])中的userlist
通过
alert(userlist)
的输出,效果非常好

更新:以下是原始输出:

更新:添加创建my userlist变量的PHP:

$allusers = entity_load('user');
$userlist = '';
if ($allusers) {
  foreach ($allusers as $useritem) {
    $dn = '';
    $manager = '';
    $fullname = '';
    if ($useritem->uid > 1) { // Skip user 0 and 1
      if (isset($useritem->field_distinguished_name['und']['0']['value'])) {
        $dn = $useritem->field_distinguished_name['und']['0']['value'];
      }
      if (isset($useritem->field_manager_dn['und']['0']['value'])) {
        $manager = $useritem->field_manager_dn['und']['0']['value'];
      }
      if (isset($useritem->field_full_name['und']['0']['value'])) {
        $fullname = $useritem->field_full_name['und']['0']['value'];
      }
      ($userlist == '') ? $userlist = '[[{v:\'' . $dn . '\', f:\'' . $fullname . '\'}, \'' . $manager . '\', \'\']' : $userlist .= ', [{v:\'' . $dn . '\', f:\'' . $fullname . '\'}, \'' . $manager . '\', \'\']';
    }
  }
  if ($userlist != '') {
    $userlist .= ']';
  }
}

根据您添加的PHP,您试图将行添加为嵌套数组

您的PHP将生成一个数组,如
var userlist=[[['bar',foo'],['foo',bar]]
,当您添加行时,它将是
addRows([[[['bar',foo'],['foo',bar]]]
,成为一个
[]


在调用
addRows()

时,尝试删除
[]
用户列表周围的
您遇到了几个问题:

  • userlist的值是一个字符串,而不是一个对象 要添加行([userlist]),您将发送一个具有单个 元素,一个字符串
  • 尝试将接收到的对象从字符串转换为字符串时 javascript、JSON.parse不起作用,因为属性名是 不带引号(
    {f:'My name'}
    应该是
    {f:'My name}
  • 当然,它可以与
    userlist=eval(“['+userlist+']')
    一起使用,但是使用eval 在您的Javascript中是
  • 您正在将名称声明为字符串,但正在发送 如果你不发送对象,你也可以摆脱Javascript/JSON解析的情况
最后,我不确定为什么您的值需要额外的方括号。从我看到的PHP代码来看,它应该已经有了数组数组的方括号

结论:更改返回值的格式,使其成为有效的JSON,然后使用读取。我不是Drupal用户,但我找到了关于如何将复杂的PHP变量传递给Javascript的答案:

下面是一个正在工作的(?)jsfiddle:将eval与最初提供的字符串一起使用

以下是一个有效的JSON:

[
    [{
            "v" : "CN=My Name,OU=IT,OU=Fesslers,DC=hpsi,DC=local",
            "f" : "My Name"
        }, "CN=Supervisor Name,OU=Sr. Management,OU=Fesslers,DC=hpsi,DC=local", ""],
    [{
            "v" : "",
            "f" : "Another Name"
        }, "", ""],
    [{
            "v" : "CN=Yet Another,OU=IT,OU=Fesslers,DC=hpsi,DC=local",
            "f" : "Yet Another"
        }, "CN=My Name,OU=IT,OU=Fesslers,DC=hpsi,DC=local", ""]
]

啊,抱歉——我是故意这么做的。我更新了原始帖子。如果我正确读取了样本数据,它似乎包含了所有必要的内容。变量userlist是如何定义的?按默认值,它将是一个数组数组,
var userlist=[[foo,bar],[bar,foo]]
,如果是这种情况,那么您将尝试在数组的数组上调用
addRows
addRows([['foo',bar',['bar',foo']])
);我的第二个猜测是,您在drupal.settings.orgchart.userlist中没有正确格式化所有内容。是否可以在此时共享您格式化输出的方式?所有内容都按照我的预期工作……我尝试了几个选项:
var userlist=drupal.settings.orgchart.userlist;
var userlist=new Array(Drupal.settings.orgchart.userlist;
。如果我像你在JS小提琴中做的那样(静态地将数据添加到var userlist),它可以工作——但如果我只是按原样使用变量,它就不能工作。我将添加呈现userlist变量的PHP。@SeanCunningham是
userlist
string?或数组的类型?请尝试:
alert(typeof userlist);
并告诉我们输出是什么?我认为它应该是
string
。它确实有响应“string”。啊,将输出更改为使用双引号,然后使用JSON.parse。谢谢!