台灣最大程式設計社群網站
線上人數
1210
 
會員總數:239330
討論主題:185675
歡迎您免費加入會員
討論區列表 >> PHP >> 新手發問,關於PHP內使用foreach+轉換Json的問題
[ 變換順序 ]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
新手發問,關於PHP內使用foreach+轉換Json的問題
價值 : 60 QP  點閱數:241 回應數:14

樓主

奔騰藍藍
門外漢
0 1
40 3
發送站內信

各位大大好:

小弟我有一個關於PHP內使用foreach+轉換Json的問題想請教大家,

我再做一個測試,在後端PHP裡,將資料轉換成Json的格式,以便"之後"前端網頁的撈值使用或顯示,

在測試一筆資料的時候是正常的,程式碼與輸出結果如下:



輸出結果:{"name":"測試用","電話":"1234567890","地址":"台北市某某區某某路某某號某某樓","E-mail":"abcdefg@gmail.com"}


但是我之後再多增加一筆資料輸出結果就變為:NULL,程式碼如下:



因為沒有錯誤訊息,測試了很多方法都沒有用,所以上來請教一下各位大大們,

這樣子的寫法是哪裡不對需要改的?

希望可以給剛學不久的我建議與指教,謝謝~!

搜尋相關Tags的文章: [ foreach ] , [ json ] , [ php ] , [ array ] ,
本篇文章發表於2017-03-09 18:30
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
回應

clouding
捐贈 VP 給 clouding 檢舉此回應
早安
有跳錯誤喔你可以把 php.ini display_errors = on 打開

第二個範例因為變二維陣列,迴圈帶進去的值是array
所以才是NULL

如果你php 版本 5.4 以上
可以用這個


5.4以下的話可以用看看 array_map()

然後key值通常應該沒有在用中文
我是沒這樣用過拉...
本篇文章回覆於2017-03-10 09:14
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
最有價值解答

迷路
捐贈 VP 給 迷路 檢舉此回應
就像一樓說的,我也反對在key值用中文
稍微修了一下,你看看是不是你要的

我最近其實不太直接提供程式碼
不過這個修改會用到遞迴
我就不強求新人能直接掌握這個技術
本篇文章回覆於2017-03-10 10:17
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
回應

可樂快跑
檢舉此回應
補充cloud的話:
任何時候,都不該讓你的索引是「中文」。
而任何做為容器的,不論是變數還是什麼東西,都不應該使用中文。
本篇文章回覆於2017-03-10 10:36
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
不錯的參考

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
針對你的問題說明一下

1.上面兩位因該有說明白,其陣列key值盡量不要用中文會比較好.

2.我不太清楚為何你會需要使用urldecode。這會讓json格式很容易發生失效。正常json會自動將中文轉換成編碼字元是有其意義的。
你就是只要照存。給javascript直接使用,或是再用json_decode轉回來陣列。它都會再出現正確的中文字的。
最算是為了給其它程式語言使用。其程式語言也因該會有如php的json_decode相關函數,可以給你提供你轉換回來。
你用urldecode感覺就是多此一舉,且又容易造成麻煩。
本篇文章回覆於2017-03-10 17:10
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
作者回應

奔騰藍藍
檢舉此回應
回復Clouding:
首先謝謝您的建議,的確,Key值最好不要設定為中文,這點已修正,
另外,錯誤訊息 display_errors = on 那邊我預設是打開的喔~!
本篇文章回覆於2017-03-12 20:56
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
作者回應

奔騰藍藍
檢舉此回應
想請教一下迷路大大,為何需要改成遞迴的方式才可成功?

的確依照您幫我修改後的程式碼,跑出的結果正是我想要的,也是正確沒有錯誤~!

但我看不太懂底下那段,為何要再呼叫自己一次? 可以麻煩您跟我解釋原因嗎?

非常謝謝您~~!


本篇文章回覆於2017-03-12 21:00
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
作者回應

奔騰藍藍
檢舉此回應
回復浩瀚星空:
非常感謝您的建議,這點我還真沒想到,當初只是想說就在後端的時候

把資料轉好,沒有想到可以利用javascript的方法轉回來,我會在多嘗試看看~!
本篇文章回覆於2017-03-12 21:03
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
回應

迷路
捐贈 VP 給 迷路 檢舉此回應
你原本的函數是針對一維陣列,所以欄位的值基本上就是值
但是當陣列不限於一維時,就會出現欄位值是陣列的情況
當然啦,如果你很肯定一定是二維陣列,當然能夠用你之前的寫法再加一層結構來處理
不過這樣會讓函數疊床架屋,並不是很好的處理方式
所以我們通常會用遞迴呼叫的方式來處理
所謂的遞迴就是自己呼叫自己的意思
這是程式設計中相當重要的基礎之一
這個概念要解釋,有圖會比較方便,建議你Google好好學習一下
本篇文章回覆於2017-03-13 09:52
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
回應

Ricky是我
檢舉此回應
json_encode 可以處理 array / object 阿
為何要自己把 array 拆解掉,然後又呼叫 json_encode,本來就可以支援的事情。
本篇文章回覆於2017-03-16 09:50
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
10樓
回應

迷路
捐贈 VP 給 迷路 檢舉此回應
拆掉的目的是因為array / object中有中文字
json_encode時會出錯,必須先將中文字以urlencode轉碼
json_encode才能正常執行
本篇文章回覆於2017-03-16 14:43
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
11樓
回應

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
@迷路

當你用json_encode來轉array成json的同時。其函數就會自動將中文字轉譯成urlencode處理了。
不需要再做urlencode處理的。

本篇文章回覆於2017-03-16 15:04
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
12樓
回應

可樂快跑
檢舉此回應
@星空
那個不是urlencode編碼。
那個是轉成另一種unicode編碼格式。
假如有人會想把json當成字串放進資料庫當資料就會發生「搜尋不能」的情形。
所以才會有編碼前先用urlencode解成非中文字再經過json_encode()之後再用urldecode反解回正常的中文字。

當然後來的作法就是在下json_encode時直接給第二個參數,告訴json_encode一來不要對中文做編碼,二來也不要把數字當字串。
本篇文章回覆於2017-03-16 18:58
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
13樓
回應

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
@可樂快跑

這有區分json跟非json格式的問題了。
認真來說,正統的json。為了防止特殊字元的問題。
所以一律會將其中文字轉成unicode編碼。其實這不只是中文字會轉,一些特殊符號也會轉的。
這就是為了json的完整性。

所以當將json內的unicode內容轉換回來。這樣的東西就已經不叫做json了。
已經是單純的字串了。

如果說只是為了可在資料庫內搜尋的情況。這我反而會比較偏向用另外一種方式來處理。
其一就是將搜尋字串做unicode編碼後再去做搜尋。
這樣一方面也不會破壞原json的格式。另一方面也可以做正常的搜尋。

原始的格式要不變的才對。
本篇文章回覆於2017-04-01 17:45
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
14樓
回應

可樂快跑
檢舉此回應
@星空
問題是出在php本身沒有一個很好的轉換unicode的機制。
如果真的要那樣做大部份看到的都是很麻煩的字串轉換機。

再來…其實urlencode和json_encode跑出來的顯示編碼格式也是不同的。
如果要直接對他們做比對也顯然不能直接比。都必須轉換成共同的格式才行。

要我直接做個結論倒也很簡單,就是:

php處理編碼這事真的是個麻煩事。



本篇文章回覆於2017-04-01 19:33
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
[ 變換順序 ]   
1

回覆
如要回應,請先登入.