array2json() - Convert PHP arrays to JSON

array2json() Logo

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...

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

Kamel at 04 Mar, 2007 04:49
Hi
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
Reply to this.
Binny V A at 05 Mar, 2007 04:35
Sorry - but I have never worked on Amos database. You have to ask this to the developers of Amos
Reply to this.
Eugene Bond at 16 Mar, 2007 07:26
Thank you
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.
Reply to this.
antonvovchenko at 13 Sep, 2007 08:49
Hi! Very useful function. Thanks. But i added one condition to check if array is empty. Because in other way it generate notices what is not good ;)

-----------------------------------
$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!
Reply to this.
jils at 10 Dec, 2007 01:49
Thanks for providing this great function!
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'.

Reply to this.
Josh at 13 Dec, 2007 12:06
Is this functionally equivalent to php 5.2's json_encode()? us2.php.net/json_encode

Josh
Reply to this.
Binny V A at 13 Dec, 2007 06:59
Yes it is. And if you are using PHP greater than 5.2, I will recommend that you use the native version instead of this.
Reply to this.
Anonymous at 18 Jan, 2008 03:41
muchas gracias senor
Reply to this.
Wilmar at 13 Feb, 2008 07:57
No funciona..con este tipo de array why?

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
)
Reply to this.
Jared at 03 May, 2008 08:26
Thank you, excellent solution, exactly what I needed!
Reply to this.
Ariel at 29 May, 2008 11:04
A really really good function!
Thanks a lot.
a.
Reply to this.
Jitendra Gupta at 22 Jun, 2008 10:54
really ArrayToJSON is really a good function but i want function JSON to Array if any body have code plz mail me on my mail id jitendra.rkdf@gmail.com.
Thanks in advance.
Reply to this.
Binny V A at 23 Jun, 2008 08:48
PHP 5 has json_decode() function - you can use that.
Reply to this.
luca at 03 Jul, 2008 01:22
hi

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
Reply to this.
luca at 03 Jul, 2008 01:33
maybe better with this on line 10, sorry

$json .= get_json($k).":".get_json($v).",";


Reply to this.
Binny V A at 03 Jul, 2008 12:17
I recommend using PHP native json_encode function.
Reply to this.
Omar Zabaneh at 07 Aug, 2008 02:16
if you have the option to upgrade to php 5.2 i recommend using json_encode of the php json extension: ca3.php.net/manual/en/function.json-encode.php.

having said that, thanks to the author for making this code available for others to use.
Reply to this.
Anonymous at 12 Sep, 2008 03:29
Thanks, this helped me.
Reply to this.
alex bodnaru at 05 Sep, 2008 11:28
great function.

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')
Reply to this.
step307 at 17 Mar, 2009 05:24
Replace
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
Reply to this.
rob ganly at 17 Jun, 2009 08:33
good stuff step307, i was having exactly that prob. you saved me some debugging time!

rob ganly
Reply to this.
Graham Bradey at 20 Mar, 2009 08:58
One further tweak to this, just to ensure numeric strings are upheld e.g. the string "5" is not cast to the number 5:

if (is_numeric($value) && !is_string($value)) $str .= $value; //Numbers
Reply to this.
King CHUNK at 27 Mar, 2009 02:01
Be warned that this function doesn't properly encode integers with leading zeros, e.g.:

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..
Reply to this.
Wesley at 16 Apr, 2009 02:55
Very nice function!
I'm stuck in php4, so it's a MUST!
Reply to this.
mmmikele at 17 Apr, 2009 06:11
Hi!!

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
Reply to this.
Anonymous at 29 Apr, 2009 10:32
Yeah, this thing is broken. This function is not at all interchangeable with the php json_encode(). I developed with the latest php and not noticing the first line of this function, was inadvertently using json_encode() anyways. Then when I tried to move to production (with an older php and no json_encode) this function broke my stuff.
Reply to this.
Ghost Bear at 06 Jun, 2009 04:52
I too noticed that problem. Fast solution will be to remove this line:
$is_list = true;
Reply to this.
Walker de Alencar at 23 Jun, 2009 07:22
with adjusts that i sent today, dont will need this are working as well.

Regards.
Reply to this.
Walker de Alencar at 23 Jun, 2009 07:19
well, i get all tips here and anothers, and adjusted the code, the result is:


<?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
}
?>

Reply to this.
hellomoto at 27 Jun, 2009 01:43
hi,
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/'))

Reply to this.
Comment

Please dont enter you comments in this form - this is a fake form to confuse spamming bots. The next form is the real one.




Comment




Comment Formating : HTML tags a, strong, em, b, i, code, pre, p and br allowed. Other tags will be shown as code(< will become &lt;). Urls, Line breaks will be auto-formated.
Subscribe to Feed