Как преобразовать массив в SimpleXML

Самым большим единственным преимуществом для меня было бы ясное разделение между Вашей Моделью, Представлением и уровнями Controller. Это помогает способствовать хорошему дизайну от запуска.

276
задан Lightness Races with Monica 13 August 2011 в 05:01
поделиться

4 ответа

короткий:

<?php

$test_array = array (
  'bla' => 'blub',
  'foo' => 'bar',
  'another_array' => array (
    'stack' => 'overflow',
  ),
);
$xml = new SimpleXMLElement('<root/>');
array_walk_recursive($test_array, array ($xml, 'addChild'));
print $xml->asXML();

приводит к

<?xml version="1.0"?>
<root>
  <blub>bla</blub>
  <bar>foo</bar>
  <overflow>stack</overflow>
</root>

ключам и значениям поменяны местами - вы можете исправить это с помощью array_flip () перед array_walk. array_walk_recursive требует PHP 5. Вместо этого вы можете использовать array_walk , но тогда вы не получите 'stack' => 'overflow' в xml.

200
ответ дан 23 November 2019 в 02:06
поделиться

Вы можете использовать xmlrpc_encode для создания xml из массива, если подробный xml не является проблемой. www.php.net/xmlrpc_encode

будьте осторожны, создаваемый xml отличается в случае использования ассоциативных и / или цифровых ключей

<?php
// /params/param/value/struct/member
// there is a tag "member" for each element
// "member" contains a tag "name". its value is the associative key
$xml1 = xmlrpc_encode(array('a'=>'b','c'=>'d'));
$simplexml1 = simplexml_load_string($xml1);
print_r($xml1);
print_r($simplexml1);

// /params/param/value/array/data
// there is a tag "data" for each element
// "data" doesn't contain the tag "name"
$xml2 = xmlrpc_encode(array('a','b'));
$simplexml2 = simplexml_load_string($xml2);
print_r($xml2);
print_r($simplexml2);
?>
0
ответ дан 23 November 2019 в 02:06
поделиться

ЕСЛИ массив ассоциативен и имеет правильные ключи, вероятно, будет проще сначала преобразовать его в xml. Что-то вроде:

  function array2xml ($array_item) {
    $xml = '';
    foreach($array_item as $element => $value)
    {
        if (is_array($value))
        {
            $xml .= "<$element>".array2xml($value)."</$element>";
        }
        elseif($value == '')
        {
            $xml .= "<$element />";
        }
        else
        {
            $xml .= "<$element>".htmlentities($value)."</$element>";
        }
    }
    return $xml;
}

$simple_xml = simplexml_load_string(array2xml($assoc_array));

Другой путь - сначала создать ваш базовый xml, например

$simple_xml = simplexml_load_string("<array></array>");

, а затем для каждой части вашего массива использовать что-то похожее на мой цикл создания текста и вместо этого использовать функции simplexml "addChild" для каждого узел массива.

Я попробую это позже и обновлю этот пост обеими версиями.

3
ответ дан 23 November 2019 в 02:06
поделиться
<?php
function array_to_xml(array $arr, SimpleXMLElement $xml)
{
    foreach ($arr as $k => $v) {
        is_array($v)
            ? array_to_xml($v, $xml->addChild($k))
            : $xml->addChild($k, $v);
    }
    return $xml;
}

$test_array = array (
    'bla' => 'blub',
    'foo' => 'bar',
    'another_array' => array (
        'stack' => 'overflow',
    ),
);

echo array_to_xml($test_array, new SimpleXMLElement('<root/>'))->asXML();
38
ответ дан 23 November 2019 в 02:06
поделиться
Другие вопросы по тегам:

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