2012-06-13 71 views
0

我有哪裏類型轉換的確在PHP SoapClient類外的客戶機服務器的情況下,不能告訴閹空數組是聯想或數字,所以默認爲數字。空關聯數組SOAP類型轉換

所有暴露的函數都使用基本類型,沒有類。

關聯數組如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中輸入casting到object中的結果會導致Ruby中的結構。

我能在PHP端,使空「聯想」的數組最終成爲在Ruby側的地圖嗎?

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

+0

我試過SOAP_USE_XSI_ARRAY_TYPE,它不適用於所提出的問題。 –

+0

在PHP中添加虛擬數組鍵不是一個可接受的解決方案。 –

+0

一個醜陋的黑客將會擴展'SoapClient'並在'SoapClient :: __ doRequest'中執行一些操作(你將XML作爲一個字符串發送)。 – Wrikken

回答

2

您可以APACHE_MAP包裝你的數組中SoapVar類的編碼參數。像這樣:

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

將測試tomorow,我會報告回來。謝謝。 –

+0

工程就像一個魅力。 –

-1

我可能是錯在這裏,但我的理解:

我相信你正在努力實現是不可能的。一個數組(我們只是在說數組,沒有對象)是一個數組。內容給出的結構使數組關聯或不關聯。

空數組不是關聯的。

+0

我知道這種情況,正如我在我的請求中特別指出的那樣。這實際上是需要克服的(我沒有downvote)。 –

0

嗯,這正是我的意思是:要解決這一問題,您需要更改腳本邏輯 - 而不是PHP。因爲你不能定義一個PHP數組要關聯,你將需要修改接收腳本。

如果是我,我也不會派一個空數組。將狀態字段放入數組中。這可能是計算的可用產品,在這種情況下,只能算作0。你將有一個更有意義的通信領域和陣列突然聯想無論在什麼 如

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

我說的是你需要改變邏輯,你不能改變PHP。

希望幫助,

烏韋

+0

product_options是一個關鍵值對配置。它會保持這種狀態,我更喜歡從根本上解決問題(調用者,PHP)。 –

+0

順便說一句,發佈的數組只是一個例子。實際上存在一個產品數字數組,而product_options是每個產品。但是,這與關聯數組的更一般問題無關。我連接的RPC API由許多其他功能組成。 –