Отображение типов SoapClient PHP ведет себя по-разному

У меня есть функция веб-сервиса, которая возвращает массив элементов в PHP-Client. В зависимости от количества элементов возвращаемый тип PHP по-разному. Если функция возвращает один элемент, то тип PHP является stdClass если функция возвращает более одного элемента, тип PHP – это array . В любом случае это должен быть array . Что я могу сделать для этого?

Детали:

var_dump результата функции веб-сервиса выглядит следующим образом:

  • если в результате получается один элемент:
    array(3) { ["filterErg"]=> object(stdClass)#37 (1) { ["item"]=> object(stdClass)#38 (9) ...
  • если в результате получается более одного элемента:
    array(3) { ["filterErg"]=> object(stdClass)#37 (1) { ["item"]=> array(16) ...

Имя функции – getFilter а соответствующие части файла WSDL:

 <types> <schema ...> <complexType name="arrayFilter"> <sequence> <element name="item" type="ns1:stFilter" minOccurs="0" maxOccurs="unbounded" nillable="true"/> </sequence> </complexType> ... </schema> </types> <message name="getFilterResponse"> <part name="filterErg" type="ns1:arrayFilter"/> <part name="functionResult" type="xsd:int"/> <part name="outErr" type="xsd:string"/> </message> <portType name="ADServicePortType"> <operation name="getFilter"> <documentation>Service definition of function ns1__getFilter</documentation> <input message="tns:getFilter"/> <output message="tns:getFilterResponse"/> </operation> ... </portType> <binding name="ADService" type="tns:ADServicePortType"> <SOAP:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> <operation name="getFilter"> <SOAP:operation style="rpc" soapAction=""/> <input> <SOAP:body use="encoded" namespace="urn:ADService" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> </input> <output> <SOAP:body use="encoded" namespace="urn:ADService" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> </output> </operation> ... </binding> 

Solutions Collecting From Web of "Отображение типов SoapClient PHP ведет себя по-разному"

Изменяйте переменную из объекта на массив, содержащий объект:

 if (is_object($variable)) { $variable = array($variable); } 

Или, более конкретно, в вашем случае:

 if (is_object($result["filterErg"]->item)) { $result["filterErg"]->item = array($result["filterErg"]->item); } 

Вы можете использовать параметр SOAP_SINGLE_ELEMENT_ARRAYS при создании SoapClient

 $soapConfig = array( 'soap_version' => SOAP_1_2, 'features' => SOAP_SINGLE_ELEMENT_ARRAYS, 'trace' => true ); $client = new SoapClient('http://localhost:8070/Services.wsdl', $soapConfig);