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.

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


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