2016年4月7日 星期四

如何在php中將陣列(array)轉成JSON格式---json_encode中文utf8

圖片來源:Jonathan Weatherhead

在php中我們常常會用陣列來處理資料,但在網頁資料傳遞的過程中,我們常常需要將資料從一端傳到另一端(例如,從伺服器端傳到客戶端),這時候我們就需要一些共通的格式來方便包裝資料和解讀資料,而JSON格式就是現在相當常用的一種(如果還不清楚什麼是JSON格式,可以參考這篇:[筆記] JavaScript中物件(object)和JSON格式的轉換)。

那麼,我們就來說明一下,要怎麼在php中將資料從陣列轉換成JSON格式吧!

當陣列索引值和元素都是英文的情況---json_encode



我們先建立一個陣列如下:


在資料都是英文的情況下,要將陣列轉成JSON格式非常的容易,只要使用php內建的函式json_encode就可達到,像是這樣:


這時候你就可以看到我們原本陣列的資料已經被轉換成JSON格式了:


程式範例
<?

$data_array_en = [
 "1" => "Apple",
 "2" => "HTC",
 "3" => "Samsung",
 "4" => "ASUS",
 "5" => "Sony"
];

$data_json_en = json_encode($data_array_en);

echo $data_json_en;

?>

當陣列當中包含中文的情況


看起來要把陣列轉成JSON似乎非常的容易,然而,當我們的資料包含中文,就會碰到一些問題...。

我們同樣的先建立一個陣列:


然後一樣直接透過json_encode來轉換資料:


這時候,會發現轉出來竟然變成一堆亂碼...


這時候我們可以怎麼做呢?

解法

這時候不必慌張,解法是這樣子的,如果中文會讓json_encode出現亂碼,那就先將資料透過urlencode讓字串當中不會有中文出現,再轉成JSON格式,最後再用urldecode把資料轉回成中文格式。

程序如下:

如果不清楚foreach的使用,可參考[筆記] PHP & MySQL 透過foreach來呼叫出陣列的值


這時候,即使我們的資料裡面有包含中文字,一樣可以順利轉換成JSON:


程式範例
$data_array = [
 "北部" => "臺北",
 "北部" => "桃園",
 "中部" => "台中",
 "南部" => "台南",
 "南部" => "高雄",
 "東部" => "花蓮",
];

// 先利用urlencode讓陣列中沒有中文
foreach($data_array as $key => $value){
 $new_data_array[urlencode($key)] = urlencode($value);
}

// 利用json_encode將資料轉成JSON格式
$data_json_url = json_encode($new_data_array);

// 利用urldecode將資料轉回中文

$data_json = urldecode($data_json_url);

echo $data_json;

包裝成function來使用吧!


如果很常會使用到把陣列轉成JSON的話,我們就把它包成一個Function來使用吧!只需要把function拷貝到程式當中,在參數的地方帶入欲轉換的成JSON的陣列就可以了!


程式碼
$data_array = [
 "北部" => "臺北",
 "北部" => "桃園",
 "中部" => "台中",
 "南部" => "台南",
 "南部" => "高雄",
 "東部" => "花蓮",
];

function array_to_json($sel_array){
 foreach($sel_array as $key => $value){
  if(is_string($key) || is_string($value)) {
   $new_array[urlencode($key)] = urlencode($value);
  }
 }

 return urldecode(json_encode($new_array));
}

echo array_to_json($data_array);

延伸閱讀

[筆記] JavaScript中物件(object)和JSON格式的轉換

[筆記] PHP & MySQL 透過foreach來呼叫出陣列的值

參考資料

小灰狼php筆記:解決PHP JSON 中文亂碼的問題
Share:

0 意見:

張貼留言