All pastes #1488968 Raw Edit

Web Service Encoded for PHP

public text v1 · immutable
#1488968 ·published 2009-07-08 23:29 UTC
rendered paste body
<?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)))));
	}
}