note 100968 added to function.json-encode
| From: | spam dot here dot pls at hotmail dot com | Date: | Wed, 17 Nov 2010 20:42:44 +0000 |
| Subject: | note 100968 added to function.json-encode | ||
| Groups: | php.notes | ||
| Request: | Send a blank email to php-notes+get-174134@lists.php.net to get a copy of this message | ||
Another way for pre-5.2.0 PHP users is using rawurlencode() in PHP to encode a string and
decodeURIComponent() in javascript to decode it. I have written following class to handle PHP arrays
and convert them to javascript format. It uses object notation for associative arrays and arrays for
the other. Nesting is supported. True, false, integers, floats and null values are presented in
respective javascript syntax.
Use: convert an array in PHP using this class, load it into the browser using ajax and then decode
the strings in the resulting object using javascript function decodeData (below).
All of the example results have passed json validator so it shoud be allright. Feel free to use
this.
PHP CLASS - encoding arrays
=======
<?php
class custom_json {
/**
* Convert array to javascript object/array
* @param array $array the array
* @return string
*/
public static function encode($array)
{
// determine type
if(is_numeric(key($array))) {
// indexed (list)
$output = '[';
for($i = 0, $last = (sizeof($array) - 1); isset($array[$i]); ++$i) {
if(is_array($array[$i])) $output .= self::encode($array[$i]);
else $output .= self::_val($array[$i]);
if($i !== $last) $output .= ',';
}
$output .= ']';
} else {
// associative (object)
$output = '{';
$last = sizeof($array) - 1;
$i = 0;
foreach($array as $key => $value) {
$output .= '"'.$key.'":';
if(is_array($value)) $output .= self::encode($value);
else $output .= self::_val($value);
if($i !== $last) $output .= ',';
++$i;
}
$output .= '}';
}
// return
return $output;
}
/**
* [INTERNAL] Format value
* @param mixed $val the value
* @return string
*/
private static function _val($val)
{
if(is_string($val)) return '"'.rawurlencode($val).'"';
elseif(is_int($val)) return sprintf('%d', $val);
elseif(is_float($val)) return sprintf('%F', $val);
elseif(is_bool($val)) return ($val ? 'true' : 'false');
else return 'null';
}
}
// prints ["apple","banana","blueberry"]
echo custom_json::encode(array('apple', 'banana', 'blueberry'));
// prints {"name":"orange","type":"fruit"}
echo custom_json::encode(array('name' => 'orange', 'type' =>
'fruit'));
// prints: ** try it yourself, cannot post long lines here **
$big_test = array(
array(
'name' => array('John', 'Smith'),
'age' => 27,
'sex' => 0,
'height' => 180.53,
'is_human' => true,
'string' => 'Hello',
),
array(
'name' => array('Green', 'Alien'),
'age' => 642,
'sex' => null,
'height' => 92.21,
'is_human' => false,
'string' => 'ããã«ã¡ã¯ï¼', // test utf8 here
)
);
echo custom_json::encode($big_test);
?>
JAVASCRIPT FUNCTION - decode rawurlencoded() strings
==================
function decodeData(data) {
for(var item in data) {
var type = typeof data[item];
if(type === 'object') decodeData(data[item]);
else if(type === 'string') data[item] = decodeURIComponent(data[item]);
}
}
----
Server IP: 147.32.160.17
Probable Submitter: 93.185.0.177
----
Manual Page -- http://www.php.net/manual/en/function.json-encode.php
Edit -- https://master.php.net/note/edit/100968
Del: integrated -- https://master.php.net/note/delete/100968/integrated
Del: useless -- https://master.php.net/note/delete/100968/useless
Del: bad code -- https://master.php.net/note/delete/100968/bad+code
Del: spam -- https://master.php.net/note/delete/100968/spam
Del: non-english -- https://master.php.net/note/delete/100968/non-english
Del: in docs -- https://master.php.net/note/delete/100968/in+docs
Del: other reasons-- https://master.php.net/note/delete/100968
Reject -- https://master.php.net/note/reject/100968
Search -- https://master.php.net/manage/user-notes.php