⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 json.php

📁 ajax 聊天室,实现多人聊天,无刷新!
💻 PHP
字号:
<?php


// encode/decode stuff is borrowed from the Zend Framework which is released under the New BSD License
if (function_exists('json_encode') && function_exists('json_decode'))
{
	class JSON_obj
	{
		function encode($data)
		{
			return json_encode($data);
		}

		function decode($data)
		{
			return json_decode($data);
		}
	}
}
else
{
	class JSON_obj
	{
	    /**
	     * Parse tokens used to decode the JSON object. These are not
	     * for public consumption, they are just used internally to the
	     * class.
	     */
	    
	    function JSON_obj()
	    {
	    	define('EOF', 0);
	    	define('DATUM', 1);
	    	define('LBRACE', 2);
	    	define('LBRACKET', 3);
	    	define('RBRACE', 4);
	    	define('RBRACKET', 5);
	    	define('COMMA', 6);
	    	define('COLON', 7);
	    }
	
	    /**
	     * Use to maintain a "pointer" to the source being decoded
	     *
	     * @var string
	     */
	    var $_source;
	
	    /**
	     * Caches the source length
	     *
	     * @var int
	     */
	    var $_sourceLength;
	
	    /**
	     * The offset within the souce being decoded
	     *
	     * @var int
	     *
	     */
	    var $_offset;
	
	    /**
	     * The current token being considered in the parser cycle
	     *
	     * @var int
	     */
	    var $_token;
	    
	    function encode($value)
	    {
	    	return $this->_encodeValue($value);
	    }
	
	    function _encodeArray(&$array)
	    {
	        $tmpArray = array();
	
	        // Check for associative array
	        if (!empty($array) && (array_keys($array) !== range(0, count($array) - 1)))
	        {
	            // Associative array
	            $result = '{';
	            foreach ($array as $key => $value)
	            {
	                $key = (string) $key;
	        		$tmpArray[] = $this->_encodeString($key) . ':' . $this->_encodeValue($value);
	            }
	            $result .= implode(',', $tmpArray);
	            $result .= '}';
	        }
	        else
	        {
	            // Indexed array
	            $result = '[';
	            $length = count($array);
	            for ($i = 0; $i < $length; ++$i)
	            {
	                $tmpArray[] = $this->_encodeValue($array[$i]);
	            }
	            $result .= implode(',', $tmpArray);
	            $result .= ']';
	        }
	
	    	return $result;
	    }

		function _encodeValue(&$value)
		{
			if (is_array($value))
			{
		        return $this->_encodeArray($value);
			}
	    	else if (is_int($value) || is_float($value))
	    	{
	    	    return (string) $value;
	        }
	        else if (is_string($value))
	        {
	            return $this->_encodeString($value);
	    	}
	    	else if (is_bool($value))
	    	{
	    	    return $value ? 'true' : 'false';
	        }
		}

		function _encodeString(&$string)
		{
			// Escape these characters with a backslash:
	        // " \ / \n \r \t \b \f
	        $search  = array('\\', "\n", "\t", "\r", "\b", "\f", '"');
	        $replace = array('\\\\', '\\n', '\\t', '\\r', '\\b', '\\f', '\"');
	        $string  = str_replace($search, $replace, $string);
	
	        // Escape certain ASCII characters:
	        // 0x08 => \b
	        // 0x0c => \f
	        $string = str_replace(array(chr(0x08), chr(0x0C)), array('\b', '\f'), $string);
	
	    	return '"' . $string . '"';
		}
		
	    /**
	     * Constructor
	     *
	     * @param string $source String source to decode
	     * @param int $decodeType How objects should be decoded -- see
	     * {@link Zend_Json::TYPE_ARRAY} and {@link Zend_Json::TYPE_OBJECT} for
	     * valid values
	     * @return void
	     */
	    function decode($source)
	    {
	        // Set defaults
	        $this->_source       = $source;
	        $this->_sourceLength = strlen($source);
	    	$this->_token        = EOF;
	    	$this->_offset       = 0;
	
	        // Set pointer at first token
	    	$this->_getNextToken();
	    	return $this->_decodeValue();
	    }
	
	    /**
	     * Recursive driving rountine for supported toplevel tops
	     *
	     * @return mixed
	     */
	    function _decodeValue()
	    {
	    	switch ($this->_token)
	    	{
	        	case DATUM:
	        	    $result  = $this->_tokenValue;
	        	    $this->_getNextToken();
	        	    return $result;
	            break;
	
	        	case LBRACE:
	        	    return $this->_decodeObject();
	            break;
	
	        	case LBRACKET:
	        	    return $this->_decodeArray();
	            break;
	
	            default:
	                return null;
	            break;
	    	}
	    }
	
	    /**
	     * Decodes an object of the form:
	     *  { "attribute: value, "attribute2" : value,...}
	     *
	     * If ZJsonEnoder or ZJAjax was used to encode the original object
	     * then a special attribute called __className which specifies a class
	     * name that should wrap the data contained within the encoded source.
	     *
	     * Decodes to either an array or StdClass object, based on the value of
	     * {@link $_decodeType}. If invalid $_decodeType present, returns as an
	     * array.
	     *
	     * @return array|StdClass
	     */
	    function _decodeObject()
	    {
	    	$result = array();
	    	$tok = $this->_getNextToken();
	
	    	while ($tok && $tok != RBRACE)
	    	{
	
	    	    $key = $this->_tokenValue;
	
	    	    $this->_getNextToken();
	
	    	    $tok = $this->_getNextToken();
	    	    $result[$key] = $this->_decodeValue();
	    	    $tok = $this->_token;
	
	    	    if ($tok == RBRACE)
	    	    {
	    	        break;
	    	    }
	
	    	    $tok = $this->_getNextToken();
	    	}
	
	        $this->_getNextToken();
	        return $result;
	    }
	
	    /**
	     * Decodes a JSON array format:
	     *	[element, element2,...,elementN]
	     *
	     * @return array
	     */
	    function _decodeArray()
	    {
	    	$result = array();
	    	$tok = $this->_getNextToken(); // Move past the '['
	    	$index  = 0;
	
	    	while ($tok && $tok != RBRACKET)
	    	{
	    	    $result[$index++] = $this->_decodeValue();
	
	    	    $tok = $this->_token;
	
	    	    if ($tok == RBRACKET || !$tok)
	    	    {
	    	        break;
	    	    }
	
	    	    $tok = $this->_getNextToken();
	    	}
	
	    	$this->_getNextToken();
	    	return $result;
	    }
	
	
	    /**
	     * Retrieves the next token from the source stream
	     *
	     * @return int Token constant value specified in class definition
	     */
	    function _getNextToken()
	    {
	    	$this->_token      = EOF;
	    	$this->_tokenValue = null;
	
	    	if (preg_match('/([\t\b\f\n\r ]+)/', $this->_source, $matches, PREG_OFFSET_CAPTURE, $this->_offset) && $matches[0][1] == $this->_offset)
	        {
	    	    $this->_offset += strlen($matches[0][0]);
	    	}
	
	    	if ($this->_offset >= $this->_sourceLength)
	    	{
	    	    return EOF;
	        }
	
	    	$str        = $this->_source;
	    	$str_length = $this->_sourceLength;
	    	$i          = $this->_offset;
	    	$start      = $i;
	
	    	switch ($str[$i])
	    	{
	        	case '{':
	        	   $this->_token = LBRACE;
	        	break;
	
	        	case '}':
	            	$this->_token = RBRACE;
	            break;
	
	            case '[':
	            	$this->_token = LBRACKET;
	            break;
	
	            case ']':
	            	$this->_token = RBRACKET;
	            break;
	
	            case ',':
	            	$this->_token = COMMA;
	            break;
	
	            case ':':
	            	$this->_token = COLON;
	            break;
	
	            case  '"':
	        	    $result = '';
	        	    do
	        	    {
	            		if ($i++ >= $str_length)
	            		{
	            		    break;
	            		}
	
	            		$chr = $str[$i];
	            		if ($chr == '\\')
	            		{
	            		    if ($i++ >= $str_length)
	            		    {
	            		        break;
	            		    }
	            		    $chr = $str[$i];
	            		    switch ($chr)
	            		    {
	                		    case '"' :
	                    		    $result .= '"';
	                    		break;
	                		    case '\\':
	                    		    $result .= '\\';
	                    		break;
	                		    case '/' :
	                    		    $result .= '/';
	                    		break;
	                		    case 'b' :
	                    		    $result .= chr(8);
	                    		break;
	                		    case 'f' :
	                    		    $result .= chr(12);
	                    		break;
	                		    case 'n' :
	                    		    $result .= chr(10);
	                    		break;
	                		    case 'r' :
	                    		    $result .= chr(13);
	                    		break;
	                		    case 't' :
	                    		    $result .= chr(9);
	                    		break;
	                		 }
	            		}
	            		else if ($chr == '"')
	            		{
	            		    break;
	            		}
	            		else
	            		{
	            		    $result .= $chr;
	            		}
	        	    }
	        	    while ($i < $str_length);
	
	        	    $this->_token = DATUM;
	        	    //$this->_tokenValue = substr($str, $start + 1, $i - $start - 1);
	        	    $this->_tokenValue = $result;
	        	break;
	
	        	case 't':
	        	    if (($i + 3) < $str_length && substr($str, $start, 4) == 'true')
	        	    {
	            		$this->_token = DATUM;
	        	    }
	        	    $this->_tokenValue = true;
	        	    $i += 3;
	        	break;
	
	        	case 'f':
	        	    if (($i + 4) < $str_length && substr($str, $start, 5) == 'false')
	        	    {
	            		$this->_token = DATUM;
	        	    }
	        	    $this->_tokenValue = false;
	        	    $i += 4;
	        	break;
	
	        	case 'n':
	        	    if (($i + 3) < $str_length && substr($str, $start, 4) == 'null')
	        	    {
	            		$this->_token = DATUM;
	        	    }
	        	    $this->_tokenValue = NULL;
	        	    $i += 3;
	        	break;
	    	}
	
	    	if ($this->_token != EOF)
	    	{
	    	    $this->_offset = $i + 1; // Consume the last token character
	    	    return($this->_token);
	    	}
	
	    	$chr = $str[$i];
		    if (preg_match('/-?([0-9]*)(\.[0-9]*)?(([eE])[-+]?[0-9]+)?/s', $str, $matches, PREG_OFFSET_CAPTURE, $start) && $matches[0][1] == $start)
			{
	    		$datum = $matches[0][0];
	
	            $val  = intval($datum);
	            $fVal = floatval($datum);
	            $this->_tokenValue = ($val == $fVal ? $val : $fVal);
	
	    		$this->_token = DATUM;
	    		$this->_offset = $start + strlen($datum);
		    }
	
	    	return($this->_token);
	    }
	}
}
?>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -