PHP Array2JSON

JSON หรือ JavaScript Object Notation ซึ่งเป็นรูปแบบของการแลกเปลี่ยนข้อมูลแบบนึง (data-interchange format) ที่คล้าย ๆ กับ XML (มี concept คล้าย ๆ กันคือ "humans to read and write" (หรือเปล่า)) เพียงแต่ว่าใช้โครงสร้างข้อมูลของ Object ของ JavaScript มาใช้แทน ด้วยเหตุผลว่าไม่ต้องมานั่งแปลงข้อมูลไปมาระหว่าง XML กับ Data type object ใน JavaScript ถ้าสื่อสารกันระหว่าง JavaScipt กันตรง ๆ ก็โยนใส่ JSON ไปเลยไม่ต้องเสียเวลา convert จริง ๆ ผมว่ามันคล้ายกับ CSV มากกว่าอีกนะ -_-‘ แต่ว่าตัวนี้มันดีกว่าตรงที่มันถูกจับคู่ระหว่าง field กับ value เป็นคู่ ๆ ทำให้จะสลับตำแหน่งยังไงขอให้มันอยู่เป็นคู่กันเป็นใช้ได้

ถ้าคิดง่าย ๆ ก็คือ Array ทุก element จะมี index และ value หรือใน Associative Array ที่มี associative key และ value แล้วก็เอามาแปลงเป็น JSON ก็ไม่ยากอะไร จริง ๆ ตัว code นี้ผมไม่ได้คิดเอง ผมนำมาจาก array2json() – Convert PHP arrays to JSON น่าจะช่วยในการแปลง array ของ PHP มาเป็น JSON ได้ง่ายขึ้น

หลายคนคงถามว่าทำไมไม่เขียนเอง ไม่ยากหรอก ก็ตอบไปเลยว่า ของมันมีอยู่แล้ว เขียนเองทำไม ? ถ้ามันไม่ดี ค่อยมาปรับทีหลังน่าจะง่ายกว่า และเสียเวลาน้อยกว่าครับ ;)

  1. < ?php
  2. function array2json($arr) {
  3.     $parts = array();
  4.     $is_list = false;
  5.     //Find out if the given array is a numerical array
  6.     $keys = array_keys($arr);
  7.     $max_length = count($arr)-1;
  8.     if(($keys&#91;0] == 0) and ($keys[$max_length] == $max_length)) {//See if the first key is 0 and last key is length - 1
  9.        $is_list = true;
  10.         for($i=0; $i<count($keys); $i++) { //See if each key correspondes to its position
  11.             if($i != $keys&#91;$i]) { //A key fails at position check.
  12.                $is_list = false; //It is an associative array.
  13.                 break;
  14.             }
  15.         }
  16.     }
  17.     foreach($arr as $key=>$value) {
  18.         if(is_array($value)) { //Custom handling for arrays
  19.             if($is_list) $parts[] = array2json($value); /* :RECURSION: */
  20.             else $parts[] = '"' . $key . '":' . array2json($value); /* :RECURSION: */
  21.         } else {
  22.             $str = '';
  23.             if(!$is_list) $str = '"' . $key . '":';
  24.             //Custom handling for multiple data types
  25.             if(is_numeric($value)) $str .= $value; //Numbers
  26.             elseif($value === false) $str .= 'false'; //The booleans
  27.             elseif($value === true) $str .= 'true';
  28.             else $str .= '"' . addslashes($value) . '"'; //All other things
  29.             // :TODO: Is there any more datatype we should be in the lookout for? (Object?)
  30.             $parts[] = $str;
  31.         }
  32.     }
  33.     $json = implode(',',$parts);
  34.     if($is_list) return '[' . $json . ']';//Return numerical JSON
  35.     return '{' . $json . '}';//Return associative JSON
  36. }
  37. ?>

ลองทดสอบด้วย

  1. $data = array('firstname'=>'Ford', 'lastname'=>'AntiTrust');
  2. echo array2json($data);

ผลก็คือ

  1. {"firstname":"Ford","lastname":"AntiTrust"}

หวังว่าคงเป็นประโยชน์กับใครหลาย ๆ คนนะครับ ;)

[Update – 8/11/2007 10:00] ตัว code มีปัญหานิดหน่อย -_-‘ แก้แล้วครับ

การนำอีเมล์จาก Outlook Express 4.* , 5.* , 6.* เข้าสู่ Microsoft Office Outlook

การนำอีเมลจาก Outlook Express 4.* , 5.* , 6.* เข้าสู่ Microsoft Office Outlook

* ในที่นี้ใช้ Office 2003 แต่ขั้นตอนใน Version เก่าๆ ก็ไม่ต่างกันมากนัก และใช้ระบบ OS รุ่น Windows XP SP1

Read more