Задать вопрос
@nikkon82

Как правильно преобразовать массив в XML?

День добрый!
Подскажите, плиз, нужно отправить данные вот по такой конструкции:

<customData>
      <customValue>
          <id></id>
          <value></value>
      </customValue>
      <!-- ... -->
    </customData>


Если отправляю вот так:
'customData' => array(
								'customValue' => array(
									array(
										'id' => 13850,
										'value' => $visit
									)
								),
								'customValue' => array(
									array(
										'id' => 13852,
										'value' => $id
									)
								),
								'customValue' => array(
									array(
										'id' => 13854,
										'value' => $ga
									)
								)
							)

То приходит только последнее значение

protected function importParams($requestXml, $params) {
        foreach($params as $key => $val) {
            if (is_array($val)) {
                $requestXml->$key = new SimpleXMLElement("<$key/>");
                foreach($val as $key2 => $val2) {
                    if (is_array($val2)) {
                        $this->importParams($requestXml->$key, $val2);
                    } else {
                        $requestXml->$key->addChild($key2, $val2);
                    }
                }
            } else {
                $requestXml->addChild($key, $val);
            }
        }
        return $requestXml;
    }
  • Вопрос задан
  • 3003 просмотра
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 3
alexey-m-ukolov
@alexey-m-ukolov Куратор тега PHP
В примере у вас XML, в коде - массив.
Повангуем и предположим, что что-то там внутри у вас преобразует массив в XML.
Тогда повангуем ещё немного и предположим, что оно сможет переварить вот такую структуру:
'customData' => array(
    array(
        'customValue' => array(
            array(
                'id' => 13850,
                'value' => $visit
            )
        ),
    ),
    array(
        'customValue' => array(
            array(
                'id' => 13852,
                'value' => $id
            )
        ),
    ),
    array(
        'customValue' => array(
            array(
                'id' => 13854,
                'value' => $ga
            )
        )
    )
)


P.S. При чём тут цикл вообще?..
Ответ написан
SilenceOfWinter
@SilenceOfWinter Куратор тега PHP
та еще зажигалка...
честно говоря писался код давно и уверен что он работает.
class XmlConverter
{
	/**
	 * Conver array in xml
	 */
	public function as_array(array $data, $xml = NULL)
	{
		if (is_null($xml))
		{
			$xml = simplexml_load_string('<'.key($data).'/>');
			$data = current($data);
			$return = TRUE;
		}
		if (is_array($data))
		{
			foreach ($data as $name => $value)
			{
				self::from_array($value, is_numeric($name) ? $xml : $xml->addChild($name));
			}
		}
		else
		{
			$xml->{0} = $data;
		}
		if ( ! empty($return))
		{
			return $xml->asXML();
		}
	}

	/**
	 * Conver xml in array
	 */
	public function to_array($xml)
	{
		$tree = NULL;
		while($xml->read())
		{
			switch ($xml->nodeType)
			{ 
				case XMLReader::END_ELEMENT: 
					return $tree; 
				case XMLReader::ELEMENT: 
					$node = array(
						'tag'   => $xml->name, 
						'value' => $xml->isEmptyElement ? '' : self::to_array($xml)
					); 
					if ($xml->hasAttributes) 
					{
						while ($xml->moveToNextAttribute())
						{
							$node['attributes'][$xml->name] = $xml->value;
						}
					}
					$tree[] = $node; 
				break; 
				case XMLReader::TEXT:
				case XMLReader::CDATA:
					$tree .= $xml->value; 
			}
		}
		return $tree; 
	}
}
Ответ написан
Комментировать
@RuComMarket
Битрикс FullStack разработчик
ты на каждый элемент массива создаешь новый элемент xml
$requestXml->$key = new SimpleXMLElement("<$key/>");

и в итоге отдаешь последний созданный, попробуй создать родительский элемент перед foreach, и в него addChild элементы массива
$requestXml = new SimpleXMLElement("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы