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で構造体になります。

空の「連想」配列をRuby側のマップとして作成するには、PHP側で何ができますか?

PHP 5.3.3、SoapClientを使用。アクションWebサービスを使用するRuby1.8.7、Rails2.3.2。

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を変更することはできません。

お役に立てば幸いです。

Uwe

于 2012-06-20T20:27:01.550 に答える
-1

私はここで間違っているかもしれませんが、私の理解では:

私はあなたが達成しようとしていることは不可能だと信じています。配列(そして私たちは配列のみを話し、オブジェクトはありません)は配列です。コンテンツによって与えられる構造は、配列を連想配列にします。

空の配列は結合的ではありません。

于 2012-06-20T01:36:16.947 に答える