在PHP和Javascript之间传递数组的最佳方法

20

我有一个从数据库中检索到的记录数组,它的格式如下:

$rows[0]['id']=1;
$rows[0]['title']='Abc';
$rows[0]['time_left']=200;


$rows[1]['id']=2;
$rows[1]['title']='XYZ';
$rows[1]['time_left']=300;
//And so on upto 10-20 rows

如何最好地将这个数组传输到我的JavaScript代码中?我希望JavaScript能够循环遍历所有记录,并使用'id'属性更新具有该id的div的一些信息。

我的JavaScript代码在外部.js文件中,但我能够在页面的HTML代码中执行PHP代码。所以我可以这样做:

在my_file.js中:

var rows=New Array();

在HTML代码中:

<html>
<head>
<script type="text/javascript" src="js/my_file.js"></script>

<script type="text/javascript">
<? foreach ($rows as $row):?>
<? extract($row);?>
rows[<?=$id;?>]['title']="<?=$title;?>";
//And so on
<? endforeach;?>
</script>
5个回答

29

我倾向于使用JSON对象来实现此功能:

  • 在服务器端,对数据进行JSON编码:json_encode($data);
  • 在JavaScript端,编写一个函数,该函数以JSON对象作为参数并对其进行解包。

当您解包对象时,可以将数组的内容打印到 <DIV> 标签中,或者在页面上任何位置显示(jQuery做得非常好)。


2
你如何使用JavaScript解析JSON对象?您能否在答案中添加一些示例代码和解析后的对象示例?谢谢。 - Ali
请查看:http://ditio.net/2008/07/17/php-json-and-javascript-usage/ - rg88
MooTools 也可以进行 JSON 编码/解码:http://mootools.net/docs/core/Utilities/JSON - samvermette

12

如果您正在处理内联数据,我一直喜欢这样做:

<script type="text/javascript">
window.sitescriptdata = {}; 
window.sitescriptdata.foo = ( <?php echo json_encode( $structure ); ?> );
</script>

对于基本的东西,这可以避免您进行 AJAX 回调。此外,如果您想将数据粘合到 DOM 节点上,我真的很喜欢“元对象”方式。

<div id="foobar">
 <div><object class="metaobject">
        <param name="data" value="<?php echo htmlentities(json_encode($data), ENT_QUOTES );?>" />
 </object></div>
</div> 
现在这可能看起来不太好,但这是一种有效的方式,可以将数据直接与DOM节点关联起来,而不需要知道该节点的确切唯一路径。如果您有许多需要附加到特定屏幕元素的数据集,则非常方便。
我通常使用jQuery的http://noteslog.com/metaobjects/插件,但它非常简单,我有时会自己编写它(曾经有一段时间我找不到插件,但知道它的工作原理)
完成后,将会有 $("div#foobar > div").get().data.($yourarrayhere)
对于您的代码可见。

1
为了回答你的问题(我在评论回复中没有足够的空间),这里是我使用的代码的非常简化的子集:
jQuery中的Javascript AJAX处理程序:
$.ajax({
   type: "POST",
   url: "BACKEND.php",
   timeout: 8000,
   data: "var1=" + myVar,
   dataType: "json",
   error: function(){
     $("#DIVID").html("<div class='error'>Error!</div>");
   },  
   success: function(jsonObj){
     $("#DIVID").html(jsonObj.mydata);
   }
 });


PHP Array:
$data['mydata'] = $myData;

最后一个问题。我尝试了一下,现在我在JavaScript中得到了一个“对象”,其中包含我的每一行,所以我认为我可以通过myObj [0] .title或myObj [1] .title访问它。问题是,如果我想通过ID获取某个东西的标题,我该如何找到它。 ID将在myObj [1] .id或myObj [0] .id中。 - Ali
1
尝试添加一个句号 Obj.1.id有关JSON符号的更多信息 http://www.hunlock.com/blogs/Mastering_JSON_(_JavaScript_Object_Notation_)请参见: var myObject = { 'color' : 'blue', 'animal' : {'dog' : 'friendly' } };document.writeln(myObject.animal.dog); // 输出 friendly - barfoon
抱歉,我在那里的格式非常糟糕。 - barfoon
其实我想知道,如果我有一行的ID但没有数组索引,如何在不必循环所有行的情况下识别它。即:我想要myObject[X].title,其中myObject[X].id = 4。这里的X是我想要的。顺便说一句,我接受你的答案,因为你已经帮了我很多 :) - Ali

1
在像这里的AJAX示例中,您可以通过以下方式解决此问题:
.php文件(ajax返回函数)
$myArray = array("object_id"=>1, "object_title"=>"Testobject");
return json_encode($myArray);

JS文件(JavaScript函数)

...
if(g_httpRequest.readyState == 4)
{
var jsonRes = JSON.parse(g_httpRequest.responseText);
alert(jsonRes.object_title)
}
...

0

我还是相对较新的,也许这种方法不是最安全的,但您始终可以将JavaScript数组转换为字符串,然后通过URL传递给PHP进行GET请求。

因此:

for(var i=0;i < jsarray.length;i++) 
{
var x = jsarray[i];
urlstring += "myvalue[]="+x+"&";
}

document.location.href = "mypage.php?"+urlstring;

然后 PHP 代码将会是:

$phparray = $_GET['myvalue'];

希望这有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接