ftimme
2012-05-14 22134018a96760a4c59fe9c385d3b5c041d88eff
- Modified json_encode function for PHP < 5.2.0.
1 files modified
84 ■■■■■ changed files
interface/lib/classes/functions.inc.php 84 ●●●●● patch | view | raw | blame | history
interface/lib/classes/functions.inc.php
@@ -111,38 +111,64 @@
    
    function json_encode($data) {
        if(!function_exists('json_encode')){
            switch ($type = gettype($data)){
                case 'NULL':
                    return 'null';
                case 'boolean':
                    return ($data ? 'true' : 'false');
                case 'integer':
                case 'double':
                case 'float':
                    return $data;
                case 'string':
                    return '"' . addslashes($data) . '"';
                case 'object':
                    $data = get_object_vars($data);
                case 'array':
                    $output_index_count = 0;
                    $output_indexed = array();
                    $output_associative = array();
                    foreach($data as $key => $value){
                        $output_indexed[] = $this->json_encode($value);
                        $output_associative[] = $this->json_encode($key) . ':' . $this->json_encode($value);
                        if($output_index_count !== NULL && $output_index_count++ !== $key){
                            $output_index_count = NULL;
                        }
            if(is_array($data) || is_object($data)){
                $islist = is_array($data) && (empty($data) || array_keys($data) === range(0,count($data)-1));
                if($islist){
                    $json = '[' . implode(',', array_map(array($this, "json_encode"), $data) ) . ']';
                } else {
                    $items = Array();
                    foreach( $data as $key => $value ) {
                        $items[] = $this->json_encode("$key") . ':' . $this->json_encode($value);
                    }
                    if($output_index_count !== NULL){
                        return '[' . implode(',', $output_indexed) . ']';
                    } else {
                        return '{' . implode(',', $output_associative) . '}';
                    $json = '{' . implode(',', $items) . '}';
                }
            } elseif(is_string($data)){
                # Escape non-printable or Non-ASCII characters.
                # I also put the \\ character first, as suggested in comments on the 'addclashes' page.
                $string = '"'.addcslashes($data, "\\\"\n\r\t/".chr(8).chr(12)).'"';
                $json = '';
                $len = strlen($string);
                # Convert UTF-8 to Hexadecimal Codepoints.
                for($i = 0; $i < $len; $i++){
                    $char = $string[$i];
                    $c1 = ord($char);
                    # Single byte;
                    if($c1 <128){
                        $json .= ($c1 > 31) ? $char : sprintf("\\u%04x", $c1);
                        continue;
                    }
                default:
                    return ''; // Not supported
                    # Double byte
                    $c2 = ord($string[++$i]);
                    if(($c1 & 32) === 0){
                        $json .= sprintf("\\u%04x", ($c1 - 192) * 64 + $c2 - 128);
                        continue;
                    }
                    # Triple
                    $c3 = ord($string[++$i]);
                    if(($c1 & 16) === 0){
                        $json .= sprintf("\\u%04x", (($c1 - 224) <<12) + (($c2 - 128) << 6) + ($c3 - 128));
                        continue;
                    }
                    # Quadruple
                    $c4 = ord($string[++$i]);
                    if(($c1 & 8) === 0){
                        $u = (($c1 & 15) << 2) + (($c2>>4) & 3) - 1;
                        $w1 = (54<<10) + ($u<<6) + (($c2 & 15) << 2) + (($c3>>4) & 3);
                        $w2 = (55<<10) + (($c3 & 15)<<6) + ($c4-128);
                        $json .= sprintf("\\u%04x\\u%04x", $w1, $w2);
                    }
                }
            } else {
                # int, floats, bools, null
                $json = strtolower(var_export($data, true));
            }
            return $json;
        } else {
            return json_encode($data);
        }