class Response {
const JSON = "json";
/**
* 按综合方式输出通信数据
* @param integer $code 状态码
* @param string $message 提示信息
* @param array $data 数据
* @param string $type 数据类型
* return string
*/
public static function show($code, $message = '', $data = array(), $type = self::JSON) {
if(!is_numeric($code)) {
return '';
}
//这一步的设计目的:可以通过地址栏get传参的方式从外部获取数据,非常灵活
$type = isset($_GET['format']) ? $_GET['format'] : $type;
$result = array(
'code' => $code,
'message' => $message,
'data' => $data,
);
switch (strtolower($type)) {
case 'json':
//如果是json,则返回json数据
self::json($code,$message,$data);
break;
case 'xml':
//如果是xml,这返回xml数据
self::xml($code,$message,$data);
break;
case 'array':
//如果传进来的值是array,这打印出这个数组
header('Content-Type:text/html; charset=utf-8');
var_dump($result);
break;
default:
#根据需要,处理业务逻辑
echo '不能识别信息';
break;
}
}
/**
* 按json方式输出通信数据
* @param integer $code 状态码
* @param string $message 提示信息
* @param array $data 数据
* return string
*/
public static function json($code, $message = '', $data = array()) {
if(!is_numeric($code)) {
return '';
}
$result = array(
'code' => $code,
'message' => $message,
'data' => $data
);
header('Content-Type:application/json; charset=utf-8');
echo self::convertArrayToJson($result);
exit;
}
/**************************************************************
*
*使用特定function对数组中所有元素做处理
*@paramstring&$array要处理的字符串
*@paramstring$function要执行的函数
*@return boolean$apply_to_keys_also是否也应用到key上
*@access public
*
*************************************************************/
public static function arrayRecursive(&$array, $function, $apply_to_keys_also = false)
{
static $recursive_counter = 0;
if (++$recursive_counter > 1000) {
die('possible deep recursion attack');
}
foreach ($array as $key => $value) {
if (is_array($value)) {
self::arrayRecursive($array[$key], $function, $apply_to_keys_also);
} else {
$array[$key] = $function($value);
}
if ($apply_to_keys_also && is_string($key)) {
$new_key = $function($key);
if ($new_key != $key) {
$array[$new_key] = $array[$key];
unset($array[$key]);
}
}
}
$recursive_counter--;
}
/**
* 转换数组为JSON格式
* @param 数组:$arr
*/
public static function convertArrayToJson($arr)
{
self::arrayRecursive($arr, 'urlencode', true);
$json = json_encode($arr);
return urldecode($json);
}
/**
* 按xml方式输出通信数据
* @param integer $code 状态码
* @param string $message 提示信息
* @param array $data 数据
* return string
*/
public static function xml($code, $message, $data = array()) {
if(!is_numeric($code)) {
return '';
}
$result = array(
'code' => $code,
'message' => $message,
'data' => $data,
);
header("Content-Type:text/xml");
$xml = "<?xml version='1.0' encoding='UTF-8'?>\n";
$xml .= "\n";
$xml .= self::xmlToEncode($result);
$xml .= "";
echo $xml;
}
public static function xmlToEncode($data) {
//准备一个接收的空数组
$xml = $attr = "";
//将这个数组的键,作为节点名称,值作为内容
foreach($data as $key => $value) {
/*约定一个规则,如果键是数字的话,格式为aaa*/
if(is_numeric($key)) {
$attr = " id='{$key}'";//属性的值需要带上引号,不然报错
$key = "item";
}
$xml .= "";
//如果$value的值是个多维数组的话,需要递归遍历
$xml .= is_array($value) ? self::xmlToEncode($value) : $value;
$xml .= "{$key}>\n";
}
return $xml;
}
}
$arr=array(
'name'=>'学PHP的小蚂蚁 改进版---wh',
'age'=>'24',
'sex'=>'male',
'url'=>'原博客 http://my.oschina.net/woshixiaomayi/blog',
'like'=>array(
'eat'=>'apple',
'drink'=>'milk',
'happy',
'lucky'
)
);
//Response::json(200,"success",$arr);
//Response::xml(200,'success',$arr);
// Response::show(200,'success',$arr,'xml');
// Response::show(200,'success',$arr,'array');
Response::show(200,'success',$arr);