I am having problems passing complex data types from a SOAP server constructed using the built-in PHP5 SOAP extension to a SOAP client using nusoap.php or PEAR::SOAP.

This is what the WSDL file looks like:

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="http://www.example.com/services/EorthoContent" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://www.example.com/services/EorthoContent" xmlns:intf="http://www.example.com/services/EorthoContent" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <wsdl:types>
    <schema targetNamespace="http://www.example.com/services/EorthoContent" xmlns="http://www.w3.org/2001/XMLSchema">
    <import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
    <complexType name="ArrayOfArrayOf_xsd_string">
      <complexContent>
        <restriction base="soapenc:Array">
          <attribute ref="soapenc:arrayType" wsdl:arrayType="xsd:string[][]"/>
        </restriction>
      </complexContent>
    </complexType>
    <complexType name="ArrayOf_xsd_string">
      <complexContent>
        <restriction base="soapenc:Array">
          <attribute ref="soapenc:arrayType" wsdl:arrayType="xsd:string[]"/>
        </restriction>
      </complexContent>
    </complexType>
    </schema>
  </wsdl:types>
....
and the rest of the functions

The complex type that isn't getting processed correctly is the "ArrayOfArrayOf_xsd_string" or xsd:string[][]

Here's an example of what the data should look like when I do a var_dump() on the returned data from a function call:

array(6) {
  [0]=>
  array(3) {
    [0]=>
    string(32) "775ab1f814d5190fb55685dbe1c6f7bd"
    [1]=>
    string(11) "Kyphoplasty"
    [2]=>
    string(115) "http://www.example.com/Booklet?ClinicID=6beb792d81342ab4b7b7bed7d91a7d79&TopicID=775ab1f814d5190fb55685dbe1c6f7bd"
  }
  [1]=>
  array(3) {
    [0]=>
    string(32) "4cdc554cbf052d95d0c6218dca340a98"
    [1]=>
    string(21) "Scheuermann's Disease"
    [2]=>
    string(115) "http://www.example.com/Booklet?ClinicID=6beb792d81342ab4b7b7bed7d91a7d79&TopicID=4cdc554cbf052d95d0c6218dca340a98"
  }
  [2]=>
  array(3) {
    [0]=>
    string(32) "012d86ee608acac7457ac979ae7d550d"
    [1]=>
    string(28) "Spinal Compression Fractures"
    [2]=>
    string(115) "http://www.example.com/Booklet?ClinicID=6beb792d81342ab4b7b7bed7d91a7d79&TopicID=012d86ee608acac7457ac979ae7d550d"
  }
  [3]=>
  array(3) {
    [0]=>
    string(32) "e2017d1a959a7159fc3514414c705aa3"
    [1]=>
    string(24) "Thoracic Disc Herniation"
    [2]=>
    string(115) "http://www.example.com/Booklet?ClinicID=6beb792d81342ab4b7b7bed7d91a7d79&TopicID=e2017d1a959a7159fc3514414c705aa3"
  }
  [4]=>
  array(3) {
    [0]=>
    string(32) "4c75b421ca09b5cb875c90e13c68d969"
    [1]=>
    string(22) "Thoracic Spine Anatomy"
    [2]=>
    string(115) "http://www.example.com/Booklet?ClinicID=6beb792d81342ab4b7b7bed7d91a7d79&TopicID=4c75b421ca09b5cb875c90e13c68d969"
  }
  [5]=>
  array(3) {
    [0]=>
    string(32) "cd057911c3a4cd05b8a79cd5d8e3a05a"
    [1]=>
    string(14) "Vertebroplasty"
    [2]=>
    string(115) "http://www.example.com/Booklet?ClinicID=6beb792d81342ab4b7b7bed7d91a7d79&TopicID=cd057911c3a4cd05b8a79cd5d8e3a05a"
  }
}

But here's what I am getting:

array(1) {
  ["item"]=>
  array(8) {
    [0]=>
    string(32) "775ab1f814d5190fb55685dbe1c6f7bd"
    [1]=>
    string(11) "Kyphoplasty"
    [2]=>
    string(115) "http://www.example.com/Booklet?ClinicID=6beb792d81342ab4b7b7bed7d91a7d79&TopicID=775ab1f814d5190fb55685dbe1c6f7bd"
    [3]=>
    array(3) {
      [0]=>
      string(32) "4cdc554cbf052d95d0c6218dca340a98"
      [1]=>
      string(21) "Scheuermann's Disease"
      [2]=>
      string(115) "http://www.example.com/Booklet?ClinicID=6beb792d81342ab4b7b7bed7d91a7d79&TopicID=4cdc554cbf052d95d0c6218dca340a98"
    }
    [4]=>
    array(3) {
      [0]=>
      string(32) "012d86ee608acac7457ac979ae7d550d"
      [1]=>
      string(28) "Spinal Compression Fractures"
      [2]=>
      string(115) "http://www.example.com/Booklet?ClinicID=6beb792d81342ab4b7b7bed7d91a7d79&TopicID=012d86ee608acac7457ac979ae7d550d"
    }
    [5]=>
    array(3) {
      [0]=>
      string(32) "e2017d1a959a7159fc3514414c705aa3"
      [1]=>
      string(24) "Thoracic Disc Herniation"
      [2]=>
      string(115) "http://www.example.com/Booklet?ClinicID=6beb792d81342ab4b7b7bed7d91a7d79&TopicID=e2017d1a959a7159fc3514414c705aa3"
    }
    [6]=>
    array(3) {
      [0]=>
      string(32) "4c75b421ca09b5cb875c90e13c68d969"
      [1]=>
      string(22) "Thoracic Spine Anatomy"
      [2]=>
      string(115) "http://www.example.com/Booklet?ClinicID=6beb792d81342ab4b7b7bed7d91a7d79&TopicID=4c75b421ca09b5cb875c90e13c68d969"
    }
    [7]=>
    array(3) {
      [0]=>
      string(32) "cd057911c3a4cd05b8a79cd5d8e3a05a"
      [1]=>
      string(14) "Vertebroplasty"
      [2]=>
      string(115) "http://www.example.com/Booklet?ClinicID=6beb792d81342ab4b7b7bed7d91a7d79&TopicID=cd057911c3a4cd05b8a79cd5d8e3a05a"
    }
  }
}

Any idea why it changes the structure putting that "item" as the first element in the array and then putting everything else in the array inside it?

I am just returning an array with a structure like so"
$ret[0][0] = "some string here";
$ret[0][1] = "some string here";
$ret[1][0] = "some string here";
$ret[1][1] = "some string here";
...

return $ret;

I have tried creating a SoapVar like this:
$ret_final = new SoapVar($ret, SOAP_ENC_OBJECT, "ArrayOfArray_xsd_string", "http://www.example.com/services/EorthoContent");

return $ret_final;

But I still get the same incorrect data structure.

Suggestions?

    Write a Reply...