array2json() - Convert PHP arrays to JSON
array2json is a PHP function that will convert the array given as its argument into a JSON string. The created JSON string will be returned. This is very useful in Ajax apps using JSON over XML. If you are using XML, you better off using my xml2array() JavaScript function.
Note: This is an old function - if you use a new version of PHP(5.2 or newer) you will get the json_encode() function. That can be used to convert arrays to a JSON string.
Usage
First you need a PHP array. For example...
$data = array(
'success' => "Sweet",
'failure' => false,
'array' => array(),
'numbers' => array(1,2,3),
'info' => array(
'name' => 'Binny',
'site' => 'http://www.openjs.com/'
)
);
Provide this array as the argument of the array2json() function...
$json = array2json($data);
The resulting string will be(actual output - the source says print array2json($data);)...
{"success":"Sweet","failure":false,"empty_array":[],"numbers":[1,2,3],"info":{"name":"Binny","site":"http:\/\/www.openjs.com\/"}}
I am formatting the output for better readability...
{
"success":"Sweet",
"failure":false,
"empty_array":{},
"numbers":[1,2,3],
"info":{
"name":"Binny",
"site":"http://www.openjs.com/"
}
}
Handled Data types
All the basic data types are handled...
- String
- Numbers
- Boolean(true/false)
- Numerical Array
- Associative Array
Objects are not handled for obvious reasons.
Code
<?php
function array2json($arr) {
if(function_exists('json_encode')) return json_encode($arr); //Lastest versions of PHP already has this functionality.
$parts = array();
$is_list = false;
//Find out if the given array is a numerical array
$keys = array_keys($arr);
$max_length = count($arr)-1;
if(($keys[0] == 0) and ($keys[$max_length] == $max_length)) {//See if the first key is 0 and last key is length - 1
$is_list = true;
for($i=0; $i<count($keys); $i++) { //See if each key correspondes to its position
if($i != $keys[$i]) { //A key fails at position check.
$is_list = false; //It is an associative array.
break;
}
}
}
foreach($arr as $key=>$value) {
if(is_array($value)) { //Custom handling for arrays
if($is_list) $parts[] = array2json($value); /* :RECURSION: */
else $parts[] = '"' . $key . '":' . array2json($value); /* :RECURSION: */
} else {
$str = '';
if(!$is_list) $str = '"' . $key . '":';
//Custom handling for multiple data types
if(is_numeric($value)) $str .= $value; //Numbers
elseif($value === false) $str .= 'false'; //The booleans
elseif($value === true) $str .= 'true';
else $str .= '"' . addslashes($value) . '"'; //All other things
// :TODO: Is there any more datatype we should be in the lookout for? (Object?)
$parts[] = $str;
}
}
$json = implode(',',$parts);
if($is_list) return '[' . $json . ']';//Return numerical JSON
return '{' . $json . '}';//Return associative JSON
}

Comments
I need a similar problem,
I am facing a problem in my project, I am trying to extract data from a stock website using a PHP code and then store the PHP array output of this code in an object oriented local database it’s name is Amos, but the problem is that Amos database doesn’t support to store directly a PHP array in it because it’s based on C tuples it means that I need to find a way to convert the PHP array into C tuples and then store it in the Amos local database.
So would you please to help me in this? If you can give me a way to do this? If you have a code that I can use it to implement this?
Thank you very much and I am looking to hear from you soon
P.s: if anyone can send me any solution for this problem to my e-mail address:
kgh_78@yahoo.com
you safe my time because I start to write same code but in 2 minutes after start I try to google good solutions (yea, I know about JSON modules and framework's classes declared on json.org but don't like them) and have found your site.
-----------------------------------
$parts = array();
$is_list = false;
if(count($arr)>0){
...
}
$json = implode(',',$parts);
-----------------------------------
Also seems it need is_array() function. But will be better if everyone try to code it on one's own.
Thanks again!
We've changed the first condition to have triple equals to avoid problems we had with type coercion:
... if(($keys[0] === 0) and ($keys[$max_length] === $max_length)) {
I also added explicit handling for "null"
.... elseif($value === null) $str .= 'null'; //send actual null, not 'null'.
Josh
Array
(
[0] => Array
(
[0] => cod_empresa
[1] => num_identificacion
[2] => razon_social
[3] => representante
[4] => tipo_empresa
[5] => telefono
[6] => direccion
)
[1] => Array
(
[0] => 1
[1] => 805029800
[2] => Empresa 1
[3] => Juliana
[4] => Propia
[5] => 475-89-96
[6] => Cr. 9 No. 9-54
)
[2] => Array
(
[0] => 2
[1] => 14528964
[2] => Empresa 2
[3] => Diego
[4] => Propia
[5] => 4516789
[6] => Cll 1 No. 13-27
)
Thanks a lot.
a.
Thanks in advance.
before reading this article I was using this
function get_json($data=null){
if($data){
if(is_array($data)){
$json='';
foreach($data as $k=>$v){
if($ret_arr = is_numeric($k)){
$json .= get_json($v).",";
}
else{
$json .= "$k:".get_json($v).",";
}
}
$json = substr($json,0,-1);
$json = ($ret_arr)? "[$json]" : "{".$json."}" ;
return $json;
}
elseif(is_string($data))
return '"'.$data.'"';
elseif(is_numeric($data))
return $data;
elseif(is_bool($data))
return ($data)?"true":"false";
}
return $data;
}
hope could help! bye
$json .= get_json($k).":".get_json($v).",";
having said that, thanks to the author for making this code available for others to use.
to whom it may concern, i have compared to the native json_encode with some unicode strings, and got that array2json does simply output it's string contents as utf-8, while json_encode does represent it as unicode strings in ascii ('\uxxxx\uyyyy')
if($i != $keys[$i]) { //A key fails at position check.
With
if($i !== $keys[$i]) { //A key fails at position check.
Otherwise assocoative array with only 1 element will be recognized as list.
( 0 != 'String') - is false
( 0 !== 'String') - is true
rob ganly
05
becomes
5
If your code depends on the leading zeros then you should just strip out the is_numeric checks so that it's always encoded as a string, or, alternatively, check for the existance of leading zeros if the length of the numeric value is greater than 1 character.
I bid you good day.
King CHUNK signing out..
I'm stuck in php4, so it's a MUST!
I found a little problem, it is not working correctly on this one:
array2json(array("items"=>array(array("op"=>'formError', "error_message"=>'wrong id', "error_ids"=>'id'),array("op"=>'close_box', time=>'500'))))
returns: [[{"op":"formError","error_message":"wrong id","error_ids":"id"},{"op":"close_box","time":500}]]
istead of {"items":[{"op":"formError","error_message":"wrong id","error_ids":"id"},{"op":"close_box","time":500}]}
does anyone know why?
cheers,
Michele
$is_list = true;
Regards.
<?php
function array2json(array $arr)
{
if(function_exists('json_encode')) return json_encode($arr); //Lastest versions of PHP already has this functionality.
$parts = array();
$is_list = false;
if (count($arr)>0){
//Find out if the given array is a numerical array
$keys = array_keys($arr);
$max_length = count($arr)-1;
if(($keys[0] === 0) and ($keys[$max_length] === $max_length)) {//See if the first key is 0 and last key is length - 1
$is_list = true;
for($i=0; $i<count($keys); $i++) { //See if each key correspondes to its position
if($i !== $keys[$i]) { //A key fails at position check.
$is_list = false; //It is an associative array.
break;
}
}
}
foreach($arr as $key=>$value) {
$str = ( !$is_list ? '"' . $key . '":' : '' );
if(is_array($value)) { //Custom handling for arrays
$parts[] = $str . array2json($value);
} else {
//Custom handling for multiple data types
if (is_numeric($value) && !is_string($value)){
$str .= $value; //Numbers
} elseif(is_bool($value)) {
$str .= ( $value ? 'true' : 'false' );
} elseif( $value === null ) {
$str .= 'null';
} else {
$str .= '"' . addslashes($value) . '"'; //All other things
}
$parts[] = $str;
}
}
}
$json = implode(',',$parts);
if($is_list) return '[' . $json . ']';//Return numerical JSON
return '{' . $json . '}';//Return associative JSON
}
?>
i noticed such error -> "info":{"name":"Binny","site":"http:\/\/www.openjs.com\/"}
correct one is -> "info":[{"name":"Binny","site":"http:\/\/www.openjs.com\/"}]
to generate sub array you have to do this inside php code:
'info' => array( array('name' => 'Binny','site' => 'http://www.openjs.com/'))
a, strong, em, b, i, code, pre, pandbrallowed. Other tags will be shown as code(< will become <). Urls, Line breaks will be auto-formated.