空关联数组SOAP类型转换

时间:2012-06-13 11:13:47

标签: php ruby-on-rails ruby soap casting

我有一个客户端服务器场景,其中PHP中的SoapClient类进行了类型转换,无法判断空数组是关联的还是数字的,因此默认为数字。

所有公开的函数都使用基本类型,没有类。

array("something"=>123)之类的关联数组会转换为地图数据类型。但是,当相同的数组为空时,例如array(),它将转换为Ruby端的数组。类型转换为对象(object)array()将导致Ruby端的结构数据类型。

这个论点有点复杂,不像上面那么简单:

array(
    "options"=>array(
        "plans"=>array(
            0=>array(
                "name"=>"abc",
                "product_options"=>array(
                    "optional_key_determines_associative_array_data_type"=>0,
                ),
            ),
        ),
    ),
);

如果"product_options"下的数组为空,则它将转换为Ruby中的数组,而不是地图。再一次,在PHP中输入到对象的类型会导致Ruby中的结构。

我可以在PHP方面做些什么来使空的“关联”数组最终作为Ruby方面的地图?

PHP 5.3.3,使用SoapClient。 Ruby 1.8.7,Rails 2.3.2使用Action Web Service。

3 个答案:

答案 0 :(得分:2)

您可以将数组包装在SoapVar类中,并将APACHE_MAP作为编码参数。像这样:

array(
    "options"=>array(
        "plans"=>array(
            0=>array(
                "name"=>"abc",
                "product_options"=> new SoapVar(array(), APACHE_MAP),
            ),
        ),
    ),
);

答案 1 :(得分:0)

嗯,这正是我的意思:要解决这个问题,您需要更改脚本中的逻辑 - 而不是PHP。由于您无法定义要关联的PHP数组,因此您需要修改接收脚本。

如果是我,我不会发送一个空数组。将状态字段放入数组中。这可能是一个计算可用产品的字段,在这种情况下将计为0.您将有一个更有意义的通信和数组IS突然关联,无论什么 e.g

"product_options" => array ('products'=>0,'...'=>...) and so forth. 

我说的是你需要改变逻辑,你不能改变PHP。

希望有所帮助,

乌韦

答案 2 :(得分:-1)

我可能在这里错了,但据我的理解:

我确实相信你想要实现的目标是不可能的。一个数组(我们只讨论数组,没有对象)是一个数组。内容给出的结构使数组关联或不关联。

空数组不是关联的。