Передача массива в функцию SOAP в PHP

Привет,

Кажется, я не могу найти способ создать запрос функции с массивом в качестве аргумента. Например, как сделать такой запрос с помощью PHP SoapClient:

<GetResultList>
  <GetResultListRequest>
    <Filters>
      <Filter>
        <Name>string</Name>
        <Value>string</Value>
      </Filter>
      <Filter>
        <Name>string</Name>
        <Value>string</Value>
      </Filter>
    </Filters>
  </GetResultListRequest>
</GetResultList>

Можно ли вызвать эту функцию без создания дополнительных классов (используя только массивы)? Если нет, то как его наиболее компактно назвать?


person bezmax    schedule 23.02.2009    source источник


Ответы (3)


Вы можете использовать эту функцию -v для преобразования массива в дерево объектов:

function array_to_objecttree($array) {
  if (is_numeric(key($array))) { // Because Filters->Filter should be an array
    foreach ($array as $key => $value) {
      $array[$key] = array_to_objecttree($value);
    }
    return $array;
  }
  $Object = new stdClass;
  foreach ($array as $key => $value) {
    if (is_array($value)) {
      $Object->$key = array_to_objecttree($value);
    }  else {
      $Object->$key = $value;
    }
  }
  return $Object;
}

Вот так:

$data = array(
  'GetResultListRequest' => array(
    'Filters' => array(
      'Filter' => array(
        array('Name' => 'string', 'Value' => 'string'), // Has a numeric key
        array('Name' => 'string', 'Value' => 'string'),
      )
    )
  )
);
$Request = array_to_objecttree($data);
person Bob Fanger    schedule 24.02.2009
comment
Большое спасибо. Работает безупречно! На самом деле я не мог найти часть массива «Фильтр» =>. - person bezmax; 24.02.2009

У меня была аналогичная проблема, и мне пришлось публиковать данные в этой структуре. Принятый ответ мне не помог

$data = array(
  'GetResultListRequest' => array(
    'Filters' => array(
        array('Name' => 'string', 'Value' => 'string'),
        array('Name' => 'string', 'Value' => 'string'),
    )
  )
);

может быть, это может помочь кому-то, если принятый ответ не работает для вас

person Tonoslav    schedule 03.06.2020

Например, вы можете попробовать это:

$data1 = new SampleStruct();  
$data1->title="Hello world";  
$data1->description="This is a sample description.";

$data2 = new SampleStruct();
$data2->title="Hello world 2";
$data2->description="This is a sample description 2.";

$client->__soapCall("sampleFunction", array(
   new SoapParam(new SoapVar(array($data1, $data2) , SOAP_ENC_ARRAY, 
       "SampleStruct_Array", "http://www.w3.org/2001/XMLSchema"), 
       "theSampleFunctionParamName")
));
person Rinzler    schedule 16.05.2012
comment
Это не отвечает на вопрос. - person Tom; 13.11.2015