Пришлось писать самому, то ли я плохо искал, то ли еще чего, но варианта удовлетворяющего меня я не нашел. Выкладываю в паблик, копирайты ради приличия сохраняйте =).. пусть мои непрофессиональные закавыки будут видны всем =)
Есть конечно официальный код (находится здесь), но он мне показался сильно большим, а мне нужен был маленький кусочек, копаться там стало лень.
Быстродействие моего кода и оф.кода не сравнивал.
Собственно сам код (не более 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
Надеюсь что это решение будет полезно еще кому-нибудь, кроме меня :).
П.С. Сей блог есть костыль для мозга :)