PHP SoapClient – несколько атрибутов с одним и тем же ключом

Я использую SoapClient, пытаясь создать что-то для этой спецификации:

<?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Header> <WSUser xmlns="http://webservices.listrak.com/v31/"> <UserName>string</UserName> <Password>string</Password> </WSUser> </soap:Header> <soap:Body> <SetContact xmlns="http://webservices.listrak.com/v31/"> <WSContact> <EmailAddress>string</EmailAddress> <ListID>int</ListID> <ContactProfileAttribute> <AttributeID>int</AttributeID> <Value>string</Value> </ContactProfileAttribute> <ContactProfileAttribute> <AttributeID>int</AttributeID> <Value>string</Value> </ContactProfileAttribute> </WSContact> <ProfileUpdateType>NotDefined or Update or Append or Overwrite</ProfileUpdateType> <ExternalEventIDs>string</ExternalEventIDs> <OverrideUnsubscribe>boolean</OverrideUnsubscribe> </SetContact> </soap:Body> </soap:Envelope> 

Я исследовал кучу, в том числе и ниже, и подумал, что у меня есть ответ. Однако он не работает. Это то, что я делаю:

 foreach ($attributes as $key => $value) { $obj = array('AttributeID' => $key, 'Value' => $value); $attrs[] = $obj; } $final_attrs = array('ContactProfileAttribute' => $attrs); $params = array( 'WSContact' => array( 'EmailAddress' => $email, 'ListID' => $listId, array('ContactProfileAttribute' => $attrs) ), 'ProfileUpdateType' => 'Overwrite', 'ExternalEventIDs' => "", 'OverrideUnsubscribe' => TRUE, ); try { $rest = $soapClient->SetContact($params); ... 

когда я распечатываю массив, я получаю следующее:

 Array ( [WSContact] => Array ( [EmailAddress] => xxx@example.com [ListID] => 26444 [0] => Array ( [ContactProfileAttribute] =&gt; Array ( [0] => Array ( [AttributeID] => 1548948 [Value] => 1 ) [1] => Array ( [AttributeID] => 1548953 [Value] => John ) [2] => Array ( [AttributeID] => 1548954 [Value] => Doe ) [3] => Array ( [AttributeID] => 1550052 [Value] => 1 ) ) ) ) [ProfileUpdateType] => Overwrite [ExternalEventIDs] => [OverrideUnsubscribe] => 1 ) 

Однако это не приводит к ожидаемому результату:

 Request = <?xml version="1.0" encoding="UTF-8"?> <env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="http://webservices.listrak.com/v31/"> <env:Header> <ns1:WSUser> <ns1:UserName>user</ns1:UserName> <ns1:Password>pw</ns1:Password> </ns1:WSUser> </env:Header> <env:Body> <ns1:SetContact> <ns1:WSContact> <ns1:EmailAddress>xxx@example.com</ns1:EmailAddress> <ns1:ListID>26444</ns1:ListID> </ns1:WSContact> <ns1:ProfileUpdateType>Overwrite</ns1:ProfileUpdateType> <ns1:ExternalEventIDs></ns1:ExternalEventIDs> <ns1:OverrideUnsubscribe>true</ns1:OverrideUnsubscribe> </ns1:SetContact> </env:Body> </env:Envelope> 

(Примечание: нет ContactProfileAttribute)

Справка:

  • SoapClient: как передать несколько элементов с тем же именем?
  • https://stackoverflow.com/questions/7351034/how-to-make-a-php-soapcall-with-same-parameters

Элемент ContactProfileAttribute находится на одном уровне слишком глубоко. Пытаться:

 $params = array( 'WSContact' => array( 'EmailAddress' => $email, 'ListID' => $listId, 'ContactProfileAttribute' => $attrs ), 'ProfileUpdateType' => 'Overwrite', 'ExternalEventIDs' => "", 'OverrideUnsubscribe' => TRUE, );