<?php// PHP Web Service Encoder// // Takes arbitrary data and encodes it to be returned (usually as a web service)//// Data Formats Supported:// - XML// - JSON// - JSONP (JSON with Padding - Used for Direct <script> Callbacks)//// Known Bugs:// - None//// Example:///* $dataSet = array ( 'persons' => array ( array ( 'name' => 'Matan Lurey', 'age' => 20, 'days' => array ( 1, 3, 5, 7 ) ) ) ); print WebServiceEncoder::encodeData($dataSet);*/// Some Notes:// - XML is not 'well made' to handle data structures. That being said, Array types (in PHP)// are encoded as best as possible.//// array(1, 2, 3) would be// <item>1</item><item>2</item><item>3</item>//// By Matan Lurey// matan [a t] lurey [d o t] org//////////////////////////////////////////////////////////////////////////////////////////////final class WebServiceEncoder{ private static function encodeArrayAsXml($parent, $array) { foreach ($array as $item) { $childElement = $parent->addChild('item'); self::encodeValueAsXml($childElement, $item); } } private static function encodeDataAsJson($data) { return json_encode($data); } private static function encodeDataAsJsonP($data, $callbackFunction) { return $callbackFunction . '(' . self::encodeDataAsJson($data) . ');'; } private static function encodeDataAsXml($data) { $rootElement = new SimpleXMLElement('<web-service />'); self::encodeValueAsXml($rootElement, $data); return $rootElement->asXML(); } private static function encodeObjectAsXml($parent, $object) { foreach ($object as $key => $value) { $childElement = $parent->addChild($key); self::encodeValueAsXml($childElement, $value); } } private static function encodeValueAsXml($parent, $value) { switch (gettype($value)) { case 'array': if (self::isAssocArray($value)) self::encodeObjectAsXml($parent, $value); else self::encodeArrayAsXml($parent, $value); break; case 'object': self::encodeObjectAsXml($parent, $value); break; default: $parent[0] = $value; break; } } /** * @param $data php data to be encoded * @param $format type of formatting to be applied * @param $optional for jsonp only, the callback function name * @return string */ public function encodeData($data, $format = 'xml', $optional = 'webService') { switch ($format) { case 'jsonp': return self::encodeDataAsJsonP($data, $optional); case 'json': return self::encodeDataAsJson($data); case 'xml': return self::encodeDataAsXml($data); } return null; } private static function isAssocArray($array) { return (is_array($array) && 0 !== count(array_diff_key($array, array_keys(array_keys($array))))); }}