<?php /**
PHP5 RJson Version 0.1.1
Copyright (c) 2013, Dmitri Russu <dmitri.russu@gmail.com> RJson return compact recursive data Array or Object Array by Algorithm Dmytro Dogadailo <entropyhacker@gmail.com>.
RJson converts any Array data collection into more compact recursive form. Compressed data is still JSON and can be parsed with `JSON.parse`. RJson can compress not only homogeneous collections, but any data sets with free structure.
Below you can see initial form!
Array: array('id' => 7, 'tags' => array('php', 'javascript', null, false, true, 2013), 'users' => array( array('first' => 'Homer', 'last' => 'Simpson'), array('first' => 'Hank', 'last' => 'Hill'), array('first' => 'Peter', 'last' => 'Griffin'), ), 'books' => array( array('title' => 'Php', 'author' => 'Grim', 'year' => 2000), array('title' => 'JavaScrip', 'author' => 'Flanagan', 'year' => 2006)) );
* OR convert object
array('id' => 7, 'tags' => stdObj('programming', 'javascript'), 'users' => array( stdObj('first' => 'Homer', 'last' => 'Simpson'), stdObj('first' => 'Hank', 'last' => 'Hill'), stdObj('first' => 'Peter', 'last' => 'Griffin'), ), 'books' => array( stdObj('title' => 'Php', 'author' => 'Grim', 'year' => 2000), stdObj('title' => 'JavaScrip', 'author' => 'Flanagan', 'year' => 2006)) );
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ RJson result compact json or one compact php array(): +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ { "id": 7, "tags": ["programming", "javascript"], "users": [ { "first": "Homer", "last": "Simpson"}, [2, "Hank", "Hill", "Peter", "Griffin"] ], "books": [ {"title": "JavaScript", "author": "Flanagan", "year": 2006}, [3, "Cascading Style Sheets", "Meyer", 2004]] } * TODO EXAMPLE OF USE RJson: * You make a call class with one simple single tone request * * $data = array( * 'projects' => Db_Model_Projects::findAllProjects($returnArrayRows), * 'settings' => Db_Model_Settings::findAllSettings($returnArrayRows), * 'pages' => Db_Model_Pages::findAllPages($returnArrayRows) * ); * * $compactArrayPackedge = RJson::pack($data); * $compactJsonFormatPackedge = RJson::pack($data, $json = true); * * $compactJsonFormatPackedge - this packedge you can send to Ajax request Where can make unpack with Js library * * <scrip language="JavaScript" type="text/javascript" > $.ajax( { "dataType": 'json', "type": "POST", "url": 'index.php?action=getData', "success": function(data) { packedge = RJSON.unpack(data); console.dir(packedge); } }); * * * TODO send packedge to server * packedge = RJSON.pack(data); * $.ajax( { "dataType": 'json', "type": "POST", "data": data, "url": 'index.php?action=saveData', "success": function(result) { console.log(result); } }); * *<script> * * RJson is a good practice to use on your Applications which make requests at server for obtains a big data * to client Application. * */
class RJson {
private static $schemas = array(); private static $maxSchemaIndex = 0; private static $decodedSchemas = array(); private static $maxDecodedSchemaIndex = 0;
/** * Method RJson::pack($data), return compact array * * @param $data * @param bool $returnJsonEncode * @return array|bool|string */ public static function pack($data, $returnJsonEncode = false) { if (!$returnJsonEncode) { return self::encode($data); } return json_encode(self::encode($data)); }
/** * @param $data * @return array|bool|string */ private static function encode($data) { if (isset($data[0]) && !is_string($data) && !is_int($data)) { return self::encodeArrayChild($data); } else if (is_string($data) || is_null($data) || is_int($data)){ return $data; } else { return self::encodeObjectArray($data); } }
/** * @param $data * @return array|bool */ private static function encodeObjectArray($data) { $data = (isset($data[0]) ? $data[0] : $data); if (is_bool($data) || is_null($data)) { return $data; } ksort($data); ksort(static::$schemas); $schemaKeys = array_keys((isset($data[0]) ? $data[0] : $data)); $numberOfSchemaKeys = count($schemaKeys);
if ($numberOfSchemaKeys === 0) { return false; }
$encoded = array(); $schema = $numberOfSchemaKeys . ':' . join('|', $schemaKeys); $schemaIndex = (isset(static::$schemas[$schema]) ? static::$schemas[$schema] : false); if ($schemaIndex) { $encoded[] = $schemaIndex; for ($i = 0; $i < $numberOfSchemaKeys; $i++) { $encoded[] = self::encode($data[$schemaKeys[$i]]); } } else { static::$schemas[$schema] = ++static::$maxSchemaIndex; $objectRow = null; if (!isset($data[0]) || !is_array($data[0])) { for ($i = 0; $i < $numberOfSchemaKeys; $i++) { $encoded[$schemaKeys[$i]] = self::encode($data[$schemaKeys[$i]]); } } } return $encoded; }
/** * @param $data * @return array */ private static function encodeArrayChild($data) { $numberOfChild = count($data); $encoded = array(); $last = null;
if($numberOfChild === 0) { return array(); }
if(is_numeric($data[0])) { array_push($encoded, 0); }
for($i = 0; $i < $numberOfChild; $i++) { if(is_object($data[$i])) { $data[$i] = get_object_vars($data[$i]); } $current = self::encode($data[$i]); $arrayKey = null; if(!is_string($current) && !is_int($current) && !is_null($current) && !is_bool($current)) { $arrayKey = array_keys($current); $arrayKey = $arrayKey[0]; }
if($i === 0 && !is_int($arrayKey)) { array_push($encoded, $current); } else if (!is_string($current) && !is_int($current) && !is_null($current) && !is_bool($current)) { $arrayKeys = (isset($encoded[0]) ? array_keys($encoded[0]) : null); $positionId = $current[0]; $currentData = array_slice($current, 1, count($current));
if(isset($encoded[0]) && isset($arrayKeys[0]) && is_string($arrayKeys[0])) { $encoded[1][0] = $positionId; foreach($currentData as $value) { $encoded[1][] = $value; } } else { $encoded[0][0] = $current[0]; foreach($currentData as $value) { $encoded[0][] = $value; } } } else if (is_string($current) || is_int($current) || is_null($current) || is_bool($current)) { $encoded[] = $current; } } return $encoded; }
/** * RJson Unpack * Example of use RJson::unpack($data); * * @param $data * @return array|bool|string */ public static function unpack($data) { return self::decode($data); }
private static function decode($data) { if((is_array($data) && isset($data[0])) || (isset($data[0]) && !is_string($data[0]))) { return self::parseArray($data); } else if (is_string($data) || is_null($data) || is_int($data)) { return $data; } else { return self::decodeNewObject($data); } }
/** * @param $data * @return array */ public static function parseArray($data) { if(count($data) === 0) { return []; } else if ((isset($data[0]) && $data[0] === 0) || (isset($data[0]) && !is_numeric($data[0]))) { return self::decodeArray($data); } else { return self::decodeObject($data); } }
/** * @param $data * @return array|bool */ public static function decodeNewObject($data) { if(is_bool($data) || is_null($data)) { return $data; } $schemaKeys = array_keys($data); if (count($schemaKeys) === 0) { return false; } $decoded = array(); static::$decodedSchemas[++static::$maxDecodedSchemaIndex] = $schemaKeys;
for($i = 0; $i < count($schemaKeys); $i++) { $decoded[$schemaKeys[$i]] = self::decode($data[$schemaKeys[$i]]); } return $decoded; }
/** * @param $data * @return array */ public static function decodeArray($data) { $numberOfSchema = count($data); $decoded = array(); for($i = (isset($data[0]) && is_int($data[0]) ? 1 : 0); $i < $numberOfSchema; $i++) { $object = self::decode($data[$i]); if (!is_string($object) && !is_int($object) && !is_null($object) && !is_bool($object)) { $objectKey = array_keys($object); if(!is_string($objectKey[0])) { foreach($object as $value) { $decoded[] = $value; } } else { array_push($decoded, $object); } } else { array_push($decoded, $object); } } return $decoded; }
/** * @param $data * @return array */ public static function decodeObject($data) { $schemaKeys = static::$decodedSchemas[$data[0]]; $schemaLength = count($schemaKeys); $total = (count($data) - 1) / $schemaLength; $decoded = array();
if ($total > 1) { for($i = 0; $i < $total; $i++) { $object = null; for($j = 0; $j <= $schemaLength; $j++) { if(isset($data[$i * $schemaLength + $j+1]) && isset($schemaKeys[$j])) { $object[$schemaKeys[$j]] = self::decode($data[$i * $schemaLength + $j+1]); } } $decoded[] = $object; } } else if ($total == 1) { for($i = 0; $i < $total; $i++) { $object = null; for($j = 0; $j <= $schemaLength; $j++) { if(isset($data[$i * $schemaLength + $j+1]) && isset($schemaKeys[$j])) { $object[$schemaKeys[$j]] = self::decode($data[$i * $schemaLength + $j+1]); } } $decoded = $object; } } return $decoded; } }
|