update: Jay Williams has flushed this out to be a lot more useful. Check out his rendition here.
…so I wrote (what I think is a) clever little function (well, two functions) to take a complex php variable and turn it into a json-ized string, ready to be passed back to javascript. It works on the principle that json really only has a couple rules if text formatting: strings go inside double quotes, with both slashes and double-quotes escaped, iterative arrays are comma delimited inside brackets [obj1,obj2], and associative arrays go inside curly-brackets {key:val,key:val}. Using these three points, and a little bit (ok, a lot of) recursion, and voila, an elegant little function.
Of course, this doesn’t handle unicode, or any really special cases, but if you’re looking for a basic object parser, and you dont’ have access to php 5.2, which has it built into the language, it’ll do the trick…
/**
* input an object, returns a json-ized string of said object
* @return
* @param $obj Object
*/
function php_json_encode($obj) {
if (is_array($obj)) {
if (array_is_associative($obj)) {
$arr_out = array();
foreach ($obj as $key=>$val) {
$arr_out[] = '"' . $key . '":' . php_json_encode($val);
}
return '{' . implode(',', $arr_out) . '}';
} else {
$arr_out = array();
$ct = count($obj);
for ($j = 0; $j < $ct; $j++) {
$arr_out[] = php_json_encode($obj[$j]);
}
return '[' . implode(',', $arr_out) . ']';
}
} else {
if (is_int($obj)) {
return $obj;
} else {
$str_out = stripslashes(trim($obj));
$str_out = str_replace(array('"', '', '/'), array('\"', '\', '/'), $str_out);
return '"' . $str_out . '"';
}
}
}
function array_is_associative($array) {
$count = count($array);
for ($i = 0; $i < $count; $i++) {
if (!array_key_exists($i, $array)) {
return true;
}
}
return false;
}

I am married to a geek.
Link | May 28th, 2008 at 1:01 pm
Handy little function. I’ve found though that It didn’t handle boolean and floats too well, so I’ve extended and restructured it a bit, you can see the changes here:
http://pastie.textmate.org/398110
Also, is this code licensed under? I’d like to use it in an Open Source project but I’d like to make sure it’s free first.
Thanks!
Link | February 23rd, 2009 at 9:41 pm
Hey Jay -
Yeah, that makes it much more useful. I’ve added a note to the top of the post for future googlers.
It’s licensed under, um, uh, the one where I get lots of money? No, I’m kidding – feel free to use it with whatever attribution you like, and thanks for making the function better!
Link | February 24th, 2009 at 9:58 am
What a great little function! The internal json_encode() is only good on PHP 5.2 or higher, this is great for building backwards compatible code. Bravo!
Link | April 14th, 2009 at 7:34 pm