0

我有一个客户端服务器场景,其中由 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 服务。

4

3 回答 3

2

您可以使用编码参数将数组包装在一个SoapVar类中。APACHE_MAP像这样:

array(
    "options"=>array(
        "plans"=>array(
            0=>array(
                "name"=>"abc",
                "product_options"=> new SoapVar(array(), APACHE_MAP),
            ),
        ),
    ),
);
于 2012-06-20T14:51:21.153 回答
0

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

如果是我,我不会发送一个空数组。将状态字段放入数组中。这可能是一个计算可用产品的字段,在这种情况下计数为 0。您将进行更有意义的通信,并且无论如何数组都会突然关联,例如

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

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

希望有帮助,

乌韦

于 2012-06-20T20:27:01.550 回答
-1

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

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

空数组不是关联的。

于 2012-06-20T01:36:16.947 回答