围绕JavaScript数组的引用(可能很容易修复)

时间:2013-12-03 22:14:48

标签: javascript arrays jquery jqplot

我的数组中的引号存在问题,这可能是一个非常简单的修复,但我无法弄清楚我到底应该如何修复它。

我正在使用JQPlot制作我的社交媒体信息图表,如Facebook喜欢,Twitter粉丝等。最初,当我加载页面时,我会显示过去两周的所有信息。

然后我使用CalenderDateSelect(一个Prototype库)添加了两个日期输入。除了这个之外,我将jQuery用于其他所有内容,所以我所有的jQuery选择器都是:

j$('element').functon();

我在PHP的帮助下引入了我原来的javascript数组。它们如下所示:

<script>

likes=[
  <?
    $i = 0;
    while($like = mysql_fetch_assoc($fb_data)) {
        $d_day = date("d-M-y", $like['date']);
        if ($i > 0) {
            echo ',';
        }
        echo "['".$d_day."', ".$like['likes']."]";
        $i++;
    }
  ?>];

<? mysql_data_seek($fb_data, 0); ?>//this resets $fb_data so I can use it again

dislikes=[
  <?
    $i = 0;
    while($like = mysql_fetch_assoc($fb_data)) {
        $d_day = date("d-M-y", $like['date']);
        if ($i > 0) {
            echo ',';
        }
        echo "['".$d_day."', ".$like['dislikes']."]";
        $i++;
    }
  ?>];

<? mysql_data_seek($fb_data, 0); ?>

impressions=[
  <?
    $i = 0;
    while($like = mysql_fetch_assoc($fb_data)) {
        $d_day = date("d-M-y", $like['date']);
        if ($i > 0) {
            echo ',';
        }
        echo "['".$d_day."', ".$like['impressions']."]";
        $i++;
    }
  ?>];

</script>

然后我将它们放入一个函数中:

socialMedia(likes, dislikes, impressions,false);

此功能执行以下操作(为便于阅读而简化)

function socialMedia(likes, dislikes, impressions, bool) {

console.log(likes);
console.log(dislikes);
console.log(impressions);

var plot1 = j$.jqplot('chart1', [likes, dislikes, impressions], {
    title:'Facebook Stats' });

if (bool) {
    plot1.destroy();
    j$.jqplot('chart1', [likes, dislikes, impressions], {
    title:'Facebook Stats' }).replot();
}   

}

此处的控制台日志显示以下内容(正确):

[["19-Nov-13", 163], ["20-Nov-13", 163], ["21-Nov-13", 164], ["22-Nov-13", 165], ["23-Nov-13", 168], ["24-Nov-13", 181], ["25-Nov-13", 205], ["26-Nov-13", 226], ["27-Nov-13", 244], ["28-Nov-13", 250], ["29-Nov-13", 269], ["30-Nov-13", 306], ["01-Dec-13", 313], ["02-Dec-13", 315]]

[["19-Nov-13", 0], ["20-Nov-13", 0], ["21-Nov-13", 0], ["22-Nov-13", 0], ["23-Nov-13", 1], ["24-Nov-13", 1], ["25-Nov-13", 0], ["26-Nov-13", 1], ["27-Nov-13", 0], ["28-Nov-13", 1], ["29-Nov-13", 0], ["30-Nov-13", 0], ["01-Dec-13", 0], ["02-Dec-13", 0]]

[["19-Nov-13", 68], ["20-Nov-13", 116], ["21-Nov-13", 63], ["22-Nov-13", 15896], ["23-Nov-13", 79617], ["24-Nov-13", 42948], ["25-Nov-13", 22290], ["26-Nov-13", 1369], ["27-Nov-13", 928], ["28-Nov-13", 921], ["29-Nov-13", 631], ["30-Nov-13", 700], ["01-Dec-13", 743], ["02-Dec-13", 300]]

注意围绕日 - 月 - 年的报价。

到目前为止一切正常。

然后我去更改结束日期(e)和开始日期输入,并在我这样做时调用此函数:

function getNewSocialData(e, s) {
    j$.ajax({
         type: 'GET',
         url: 'ajax/social_media.php?e='+e+'&s='+s,
         success:function(json){

            data = json;
            data = json.split("T");

            socialMedia(data[0],data[1],data[2],true);
         },
         error: function (xhr, ajaxOptions, thrownError) {
            alert('There appears to be a problem with the information you submitted. Please try again or contact us.');
          }
    });
}

在social_media.php中,我执行以下操作:

$end_date = date("Y-m-d 00:00", strtotime($_GET['e']));
$start_date = date("Y-m-d 00:00", strtotime($_GET['s']));

$fb_data = getFacebookData(strtotime($start_date), strtotime($end_date));

$inside_likes = array();
$inside_dislikes = array();
$inside_impressions = array();

$i = 0;
while($like = mysql_fetch_assoc($fb_data)) {
    $d_day = date("d-M-y", $like['date']);

    $string = $i != 0 ? ',' : '';

    $inside_likes[] = $string.'"'.$d_day.'",'.$like['likes'];
    $inside_dislikes[] = $string.'"'.$d_day.'",'.$like['dislikes'];
    $inside_impressions[] = $string.'"'.$d_day.'",'.$like['impressions'];

    $i++;
}   

$data['likes'][] = $inside_likes;
$data['dislikes'][] = $inside_dislikes;
$data['impressions'][] = $inside_impressions;

foreach ($data as $data_part) {
   foreach ($data_part as $part) {
       foreach($part as $info) {
           echo $info;   
       }
   echo 'T'; //we split on this 
   }
}

然后我们获取这些数据,正如您在ajax调用中看到的那样,我们通过socialMedia()函数和console.log运行数据。这次我的数据如下:

"20-Nov-13",163,"21-Nov-13",164,"22-Nov-13",165,"23-Nov-13",168,"24-Nov-13",181,"25-Nov-13",205,"26-Nov-13",226,"27-Nov-13",244,"28-Nov-13",250,"29-Nov-13",269,"30-Nov-13",306,"01-Dec-13",313,"02-Dec-13",315

"20-Nov-13",0,"21-Nov-13",0,"22-Nov-13",0,"23-Nov-13",1,"24-Nov-13",1,"25-Nov-13",0,"26-Nov-13",1,"27-Nov-13",0,"28-Nov-13",1,"29-Nov-13",0,"30-Nov-13",0,"01-Dec-13",0,"02-Dec-13",0

"20-Nov-13",116,"21-Nov-13",63,"22-Nov-13",15896,"23-Nov-13",79617,"24-Nov-13",42948,"25-Nov-13",22290,"26-Nov-13",1369,"27-Nov-13",928,"28-Nov-13",921,"29-Nov-13",631,"30-Nov-13",700,"01-Dec-13",743,"02-Dec-13",300

而且,正如您所看到的,这些是不是数组,它们是字符串,因此JQPlot会抛出错误“未捕获的异常:无数据”。然后我们修改成功条件以将它们放入数组中:

success:function(json){
    var likes = [];
    var dislikes = [];
    var impressions = [];
    var followers = [];
    var following = [];
    var tweets = [];

data = json;
data = json.split("T");

likes.push(data[0]);
dislikes.push(data[1]);
impressions.push(data[2]);
followers.push(data[3]);
following.push(data[4]);
tweets.push(data[5]);

socialMedia(likes,dislikes,impressions,true);
    }....

它控制台如下:

[""20-Nov-13",163,"21-Nov...13",313,"02-Dec-13",315"]
[""20-Nov-13",0,"21-Nov-1...Dec-13",0,"02-Dec-13",0"]
[""20-Nov-13",116,"21-Nov...13",743,"02-Dec-13",300"]

其中包含我的所有数据,但内部引用,导致JQPlot无法解析它,并将我的图表默认为1969年12月31日。

所以,我的问题是:如何以这样的方式推送数据,以便报价不会出现?我觉得我可能有一个字符串和一个阵列混合在这里。有人能指出我正确的方向吗?

万分感谢!

修改

谢谢大家的帮助。我越走越近了。我改变我的PHP运行如下:

while($like = mysql_fetch_assoc($fb_data)) {
$d_day = date("d-M-y", $like['date']);

$inside_likes[] = array('"'.$d_day.'",'.$like['likes']);
$inside_dislikes[] = array('"'.$d_day.'",'.$like['dislikes']);
$inside_impressions[] = array('"'.$d_day.'",'.$like['impressions']);
}   

$data['likes'] = $inside_likes;
$data['dislikes'] = $inside_dislikes;
$data['impressions'] = $inside_impressions;

echo json_encode($data);
exit;

我的AJAX调用现在执行以下操作:

j$.ajax({
         type: 'GET',
         url: 'ajax/social_media.php?e='+e+'&s='+s,
     dataType : "json",
         success:function(json){
            var likes = json['likes'];
            var dislikes = json['dislikes'];
            var impressions = json['impressions'];

    socialMedia(likes, dislikes, impressions, true);
         },
        ...
    });

但是现在,当我在console.log中时,我得到了这个,请注意双引号。

[[""19-Nov-13",163"], [""20-Nov-13",163"], [""21-Nov-13",164"], [""22-Nov-13",165"], [""23-Nov-13",168"], [""24-Nov-13",181"], [""25-Nov-13",205"], [""26-Nov-13",226"], [""27-Nov-13",244"], [""28-Nov-13",250"], [""29-Nov-13",269"], [""30-Nov-13",306"], [""01-Dec-13",313"], [""02-Dec-13",315"]]

当我得到这个时:

[["19-Nov-13", 163], ["20-Nov-13", 163], ["21-Nov-13", 164], ["22-Nov-13", 165], ["23-Nov-13", 168], ["24-Nov-13", 181], ["25-Nov-13", 205], ["26-Nov-13", 226], ["27-Nov-13", 244], ["28-Nov-13", 250], ["29-Nov-13", 269], ["30-Nov-13", 306], ["01-Dec-13", 313], ["02-Dec-13", 315]]

有人有什么建议吗?谢谢!

SOLUTION:

在下面的帮助下,以字符串和整数格式获取数组的答案是执行以下操作:

while($like = mysql_fetch_assoc($fb_data)) {
$d_day = date("d-M-y", $like['date']);

$inside_likes[] = array($d_day, intval($like['likes']));
$inside_dislikes[] = array($d_day, intval($like['dislikes']));
$inside_impressions[] = array($d_day, intval($like['impressions']));
}   

$data['likes'] = $inside_likes;
$data['dislikes'] = $inside_dislikes;
$data['impressions'] = $inside_impressions;

echo json_encode($data);

1 个答案:

答案 0 :(得分:3)

social_media.php中,您似乎在推动字符串而不是数组。

这似乎不对:

$inside_likes[] = $string.'"'.$d_day.'",'.$like['likes'];

试试这个:

$inside_likes[] = array($string.'"'.$d_day, $like['likes']);

看起来你在脚本中构建了自己的JSON。那不是个好主意。我将研究使用json_encode()格式化JSON。

更新

每个数组应包含两个元素:日期字符串和喜欢的数量。你现在正在做的是将两者连接成一个字符串,这不是你想要的。

试试这个:

$inside_impressions[] = array($d_day, $like['impressions']);