我的数组中的引号存在问题,这可能是一个非常简单的修复,但我无法弄清楚我到底应该如何修复它。
我正在使用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);
答案 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']);