说道Ajax其实质就是通过Javascript向服务器提交请求,获得服务器返回的信息,然后再使用Javascript进行处理,更新网页,从而实现最明显的表现,无刷新更改网页内容。其中Jvascript与服务器脚本语言之间的信息传递是很重要的一个部分,一般来说这一部分应该由XML承担,但是一般却不一定非得传递XML,数组、字符串甚至对象也都可以传递,这里讨论一下PHP和Javascript之间复杂结构数据的传递问题。
用过Sajax0.10(目前官方公开的最新版)的朋友应该知道,如果直接在PHP的函数中return一个数组,或者通过Javascript向服务器端传递一个数组,在另一端是没法处理的,这是为什么呢?其实很容易理解,不同的语言之间数组的结构是不一样,当然这不只是数组,还包括对象等等。
举一个很简单的例子,PHP数组array(1,2,3)在Javascript的格式是[1,2,3],你可以写一个简单的html来验证,内容类似于下面给出的。你访问看看弹出窗口显示的内容。同理对象等其他的复杂元素也是如此。
[js]<script language=”javascript”>
var v;
v = [1,2,3];
alert(v[1]);
</script>
[/js]
解决这个问题最好的方法是JSON(JavaScript Object Notation),因为这里是讨论PHP嘛,所以我们关心的是JSON in PHP——JSON-PHP和PHP-JSON。JSON-PHP是一个类,可以从PEAR网站获得;PHP-JSON是PHP的module,虽然安装module可以一劳永逸的解决数据结构转换问题,但是毕竟不是所有人都有独立服务器,可以随意安装module的,所以我们主要关心的是JSON-PHP。
官方已经给出了例子,很好理解
建立对象:
[php]
require_once(‘JSON.php’);
$json = new Services_JSON();[/php]
将PHP变量(这里是$value)转换成Javascript格式:
[php]$value = $json->encode($value);[/php]
将Javascript格式的变量(这里是$value)转换成PHP的格式:
[php]$value = $json->decode($value); [/php]
PHP5.2之后请直接使用PHP的内置JSON函数,形如:
[php]
$value = json_encode($value);[/php]
[php]$value = json_decode($value); [/php]
如果不用JSON那么如何处理复杂结构数据呢?那就需要在传递之前把数据变成基本的字符串,得到的字符串再经过处理变成原始的类型就可以用咯,例如一维数组可以这样处理:
首先定义一种基本上不会在数据中出现的字符串作为分割符,这里用的是~~|~~:
[php]define(‘SPLITE_VAR’, ‘~~|~~’);[/php]
[js]var splite_var = “< ?php echo SPLITE_VAR ?>”;[/js]
传递一维数组value_array之前用~~|~~把数组变成由上面的分隔符分割的字符串value:
[php]$value = implode(SPLITE_VAR, $value_array);[/php]
[js]var value = value_array.join(splite_var);[/js]
得到字符串value后根据分隔符把字符串分割成数组value_array,然后可以使用这个数组进行下一步操作:
[php]$value_array = explode(SPLITE_VAR, $value);[/php]
[js]var value_array = value.split(splite_var);[/js]
上面只是简单的处理思路,其他类型的数据则需要你自己来灵活处理咯:icon_em04:。
Sajax0.11可以自动转换格式哦~xajax因为直接由方法控制Javascript的显示,估计不需要这样的数据传递,使用XML传输的只需要对XML进行解析就是了,不过这方面我没有实践过。
最后,希望本文能够有点用处吧。
好文!!!
:icon_em16::icon_em16:
好文章!
好文章,为了JSON的推广,已经转载了贵文!
[…]PHP和JavaScript使用JSON交换数据: https://www.flyinghail.net/archives/10%5B…]