Самым большим единственным преимуществом для меня было бы ясное разделение между Вашей Моделью, Представлением и уровнями Controller. Это помогает способствовать хорошему дизайну от запуска.
короткий:
<?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.
Вы можете использовать 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);
?>
ЕСЛИ массив ассоциативен и имеет правильные ключи, вероятно, будет проще сначала преобразовать его в 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" для каждого узел массива.
Я попробую это позже и обновлю этот пост обеими версиями.
<?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();