Пришлось писать самому, то ли я плохо искал, то ли еще чего, но варианта удовлетворяющего меня я не нашел. Выкладываю в паблик, копирайты ради приличия сохраняйте =).. пусть мои непрофессиональные закавыки будут видны всем =)
Есть конечно официальный код (находится здесь), но он мне показался сильно большим, а мне нужен был маленький кусочек, копаться там стало лень.
Быстродействие моего кода и оф.кода не сравнивал.
Собственно сам код (не более 3кб, вместе с комментариями):
/*
* XMLRPC query builder , singletone class
* 2011, Written by Wizard
* http://awlee.ru
*/
class xmlrpc {
private static $_instance = null;
private function __construct() {} // restrict constructor
private function __clone() {} // restrict clone
public static function get_instance() {
if (self::$_instance == null)
self::$_instance = new self();
return self::$_instance;
}
// check for associative array
private function _is_hash($a) {
if (is_array($a))
foreach ($a as $k=>$v)
if (!is_numeric($k))
return true;
return false;
}
// own type detector
private function _get_type($v) {
if ($this->_is_hash($v)) return "struct";
if (is_array($v)) return "array";
if (is_bool($v)) return "boolean";
if (is_float($v)) return "double";
if (is_numeric($v)) return "int";
if (is_string($v)) return "string";
return strtolower(gettype($v));
}
// basic xmlrpc value wrapper
private function _item($name=null,$value,$type = null) {
$have_type = !is_null($type);
$v = ($have_type?"<$type>":"").$value.($have_type?"</$type>":"");
if (is_null($name))
return "<value>".$v."</value>";
if ($name == "")
return "<param><value>".$v."</value></param>";
return "<member><name>$name</name><value>".$v."</value></member>";
}
// core xmlrpc function
// array is:
// array(
// array(value, type),
// array(value, type),
// array(value, type),
// ...
// )
private function _array($arr, $is_root=false) {
if (!is_array($arr))
return "";
$r = "";
$is_hash = $this->_is_hash($arr); // parent array is hash
foreach ($arr as $k=>$v) {
$t = $this->_get_type($v);
if ( is_array($v)
&& (count($v)==2)
&& (!$this->_is_hash($v))
&& (!is_array($v[1]))) {
$t = $v[1]; // type
$v = $v[0]; // value
}
switch ($t) {
case "array":
$r .= $this->_item(
$is_hash?$k:($is_root?"":null),
"<data>".
$this->_array($v).
"<data>",
"array"
);
break;
case "struct":
$r .= $this->_item(
$is_hash?$k:($is_root?"":null),
$this->_array($v),
"struct"
);
break;
default:
$r .= $this->_item(
$is_hash?$k:($is_root?"":null),
($t=="boolean")?($v?1:0):$v,
$t
);
}
}
return $r;
}
// build full xml-query
public function build_query($method, $params=null) {
$r = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
$r .= "<methodCall>";
$r .= "<methodName>$method</methodName>";
$r .= "<params>".$this->_array($params, true)."</params>";
$r .= "</methodCall>";
return $r;
}
};
и пример использования:
include("xmlrpc.php");
$b = xmlrpc::get_instance();
echo $b->build_query("method_without_params");
echo "\n\n";
echo $b->build_query("method_with_params",
array(
array(true, "boolean"),
array(true, "boolean"),
array("hello world", "string"),
array("100500", "int"),
array(
array(
array(12,"int"),
array(144,"int")
),
"array"
), // struct array
array(
array(
"a"=>array(2,"int"),
"b"=>array(3,"int")
),
"struct"
) // struct param
) // params array
); // build_query
Надеюсь что это решение будет полезно еще кому-нибудь, кроме меня :).
П.С. Сей блог есть костыль для мозга :)