溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

php和js怎么通過json互相傳遞數(shù)據(jù)

發(fā)布時(shí)間:2021-02-01 10:34:03 來源:億速云 閱讀:236 作者:小新 欄目:開發(fā)技術(shù)

這篇文章給大家分享的是有關(guān)php和js怎么通過json互相傳遞數(shù)據(jù)的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。

1、一維數(shù)組

考慮php數(shù)組

$array=array("1","2","3");

使用json_encode函數(shù)轉(zhuǎn)化后,對(duì)應(yīng)的json字符串為

["1","2","3"]。

細(xì)心的朋友很快就發(fā)現(xiàn),轉(zhuǎn)化后得到的json字符串,就是javascript中的數(shù)組形式,那么是否可以用js的數(shù)組訪問方式來訪問呢?

當(dāng)然是可以的,但是你將這個(gè)json字符串傳遞給給js時(shí),需要使用urlencode函數(shù)對(duì)其編碼,如:

<a href="javascript:show('<?php echo urlencode(json_encode(array('1','2','3')));?>')" id="aj">訪問json</a>

我們可以用下面的js代碼來驗(yàn)證:

function show(str){

var jobj=eval_r(decodeURI(str));

alert(jobj[2]);

}

大家自己試一試就會(huì)發(fā)現(xiàn),是的,可以用js中訪問一維數(shù)組的方式來訪問它。eval方法將json字符串解釋為json對(duì)象,因?yàn)閭鬟f過來的是字符串,不轉(zhuǎn)化的話,你得到將是字符串中第三個(gè)字符的值。

我們?cè)賮韺?duì)這個(gè)一維數(shù)組做一下變化,我們發(fā)現(xiàn)上面的一維數(shù)組沒有指定索引,所以它默認(rèn)為數(shù)字索引,現(xiàn)在我們來給它加上鍵名:

考慮php數(shù)組

$array=array('a'=>'1','b'=>'2','c'=>'3');

使用json_encode函數(shù)轉(zhuǎn)化后,對(duì)應(yīng)的json字符串為

{"a":"1","b":"2","c":"3"}

。

我們很快就發(fā)現(xiàn)了其中的不同,最明顯的就是字符串兩端的[]變成了{(lán)},那么這個(gè)字符串是否也可以按上面那樣處理后被js訪問呢?我們不防試一試:

<a href="javascript:show('<?php echo urlencode(json_encode(array('a'=>'1','b'=>'2','c'=>'3')));?>')" id="aj">訪問json</a>

function show(str){

var jobj=eval_r(decodeURI(str));

alert(jobj.a);

}

大家如果動(dòng)手試了就知道,點(diǎn)擊鏈接后,沒有出現(xiàn)彈窗。為什么呢?是PHP生成的json字符串格式不對(duì)嗎?不是的,這是我們?cè)谑褂胑val函數(shù)解釋的時(shí)候,出錯(cuò)了。把上面的函數(shù)代碼換成:

function show(str){

var jobj=eval_r('('+decodeURI(str)+')');

alert(jobj.a);

}

再試試吧!怎么樣,可以訪問了吧。這告訴我們,在使用eval方法處理帶有鍵名的json字符串時(shí),需要在字符串兩端加速括號(hào)。至于為什么,站長(zhǎng)也不知道,站在巨人的肩膀上而已。

這里要注意,盡管PHP生成的json字符串

{"a":"1","b":"2","c":"3"}被傳遞給js后無法被直接解釋為json格式,但是如果你在js中使用該字符串直接創(chuàng)建json數(shù)據(jù),是可以的。試試下面的代碼吧:

var jobj={"a":"1","b":"2","c":"3"};

alert(jobj.b);

2、二維數(shù)組

二維數(shù)組在PHP用的應(yīng)用非常廣泛,因此了解二維數(shù)組轉(zhuǎn)化后的json格式非常重要。有了上面的例子做鋪墊,下面站長(zhǎng)就直接給出示例代碼:

<a href="javascript:show('<?php echo urlencode(json_encode(array(array('1','2','3'))));?>')" id="aj">訪問json</a>

function show(str){

var jobj=eval_r(decodeURI(str));

alert(jobj[0][0]);

}

大家運(yùn)行,會(huì)發(fā)現(xiàn),這跟一維數(shù)組差不多,這是不帶鍵名的例子,因此在show函數(shù)中,去掉字符串兩端的括號(hào)也是可以的。

下面,我們對(duì)二維數(shù)組進(jìn)行一下變化,在第二維中加入鍵名,請(qǐng)看示例代碼:

<a href="javascript:show('<?php echo urlencode(json_encode(array(array("a"=>'1',"b"=>'2','3'))));?>')" id="aj">訪問json</a>

function show(str){

var jobj=eval_r('('+decodeURI(str)+')');

alert(jobj[0].a);

}

大家運(yùn)行代碼后,發(fā)現(xiàn),這里我們?cè)L問json數(shù)據(jù)的方式有點(diǎn)不一樣。上面我們用的是

alert(jobj[0][0]);

而這里我們用的是

alert(jobj[0].a);不要問我為什么,就是這樣。這就是json的訪問方式。

上面的例子,我們對(duì)二維數(shù)組的第二維添加了鍵名,下面我們對(duì)第一維添加鍵名,看看訪問方式又有什么不同:

<a href="javascript:show('<?php echo urlencode(json_encode(array('k'=>array('1','2','3'))));?>')" id="aj">訪問json</a>

function show(str){

var jobj=eval_r('('+decodeURI(str)+')');

alert(jobj.k[1]);

}

這里我們使用的是

jobj.k[1]這樣的方式,大家一定已經(jīng)發(fā)現(xiàn)了,只要數(shù)組中含有鍵名,當(dāng)數(shù)組被轉(zhuǎn)化為json格式后,就要使用

json對(duì)象.鍵名

這樣的方式來訪問該鍵下的元素,上面的例子中,k鍵下的數(shù)組元素是數(shù)字索引,所以在json中使用k[1]這樣的方式來訪問。

下面,我們對(duì)數(shù)組的第一維和第二維都添加鍵名:

<a href="javascript:show('<?php echo urlencode(json_encode(array('k'=>array("a"=>'1','2','3'))));?>')" id="aj">訪問json</a>

function show(str){

var jobj=eval_r('('+decodeURI(str)+')');

alert(jobj.k.a);

}

正如上面所提到的,只要含有鍵名,就必須以

json對(duì)象.鍵名

的方式來訪問,如果有多個(gè)鍵就要用

json對(duì)象.鍵名.鍵名...

,不要問我為什么,這就是json的訪問方式,只有javascript的發(fā)明者能向你解釋,他為什么要這樣規(guī)定。

結(jié)論:

1、將php中的數(shù)組轉(zhuǎn)化為json字符串傳遞給js時(shí)。如果數(shù)組沒有指定鍵名,那么可以直接使用js的eval方法將其轉(zhuǎn)化為json格式供js處理;如果數(shù)組中含有鍵名,那么在使用eval方法處理時(shí),需要使用

()

將json字符串括起來。

2、如果數(shù)組中含有鍵名,轉(zhuǎn)化為json字符串后,在js中要用

json對(duì)象.鍵名.鍵名...

的方式來訪問,如果是數(shù)字索引則用

json對(duì)象[1]

或者

json對(duì)象.鍵名[1]

這樣的方式。

上面,我們主要討論了,在PHP向js傳遞json字符串時(shí),需要注意的事項(xiàng)。下面我們?cè)賮碛懻摚胘s向php傳遞json字符串時(shí)需要如何處理。

聰明的你肯定已經(jīng)知道了,只要將json數(shù)據(jù)用引號(hào)引起來作為字符串傳遞給PHP【通常用ajax進(jìn)行】就可以用json_decode函數(shù)解碼了。沒錯(cuò)!就是這樣!但是在構(gòu)造json字符串的時(shí)候一定要仔細(xì),如果你不經(jīng)常構(gòu)造json字符串,那么不妨用

echo json_encode(array('k'=>array("a"=>'1','2','3')))

這樣的方式,查看你需要構(gòu)造的目標(biāo)字符串的json格式。這樣你就可以在js中根據(jù)你想要的結(jié)果來構(gòu)造了!

感謝各位的閱讀!關(guān)于“php和js怎么通過json互相傳遞數(shù)據(jù)”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI