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
// - 1
- 2
- 3
//
// 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('');
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)))));
}
}