Как я могу преобразовать многомерный массив PHP в XML?

1. Что я могу сделать

Я знаю, как преобразовать XML в многомерный массив PHP, я делаю это так:

$xml = file_get_contents('data.xml');
$data = json_decode(json_encode((array) simplexml_load_string($xml)),1);

Сейчас $data мой массив PHP

2. Что я должен уметь делать

Но что, если я изменил этот массив и захочу вернуть его обратно в файл? Я должен быть в состоянии сделать противоположное право? Но я не могу узнать, как ..

3. Что не решает мою проблему

Этот пост подходит близко, но не возвращает данные в том же порядке: Как преобразовать массив в SimpleXML

И это не должно быть так сложно, не так ли? Конвертировать многомерный массив в XML

2

Решение

Обойдите массив и поместите его в XML с помощью простых операций dom. Или, для старой школы, пройдите цикл, объединяющий XML в строку типа. $xmlstring .= '<tag>' . $arr[x][y] .'</tag>' а затем загрузить результат в Simplexml с simplexml_load_string,

Но лучшее, что нужно сделать, это не переключитесь с использования simplexml на массив, если вы собираетесь внести изменения и сохранить XML снова. Пройдите по XML-файлу с помощью DOM simplexml, а не конвертируйте его в массив. Тогда любые изменения, которые вы делаете с DOM, вы можете сохранить без необходимости конвертировать туда и обратно.

1

Другие решения

У меня была такая же проблема и проблемы с поиском просто решение. Приведенное ниже решение использует DOMDocument для обеспечения симпатичной печати. Если вы не хотите использовать Pretty Printing, установите $ doc-> formatOutput = FALSE;

Я смиренно отправляю следующую функцию PHP:

function array2xml($data, $name='root', &$doc=null, &$node=null){
if ($doc==null){
$doc = new DOMDocument('1.0','UTF-8');
$doc->formatOutput = TRUE;
$node = $doc;
}

if (is_array($data)){
foreach($data as $var=>$val){
if (is_numeric($var)){
array2xml($val, $name, $doc, $node);
}else{
if (!isset($child)){
$child = $doc->createElement($name);
$node->appendChild($child);
}

array2xml($val, $var, $doc, $child);
}
}
}else{
$child = $doc->createElement($name);
$node->appendChild($child);
$textNode = $doc->createTextNode($data);
$child->appendChild($textNode);
}

if ($doc==$node) return $doc->saveXML();
}//array2xml

Используя следующие тестовые данные и вызов:

$array = [
'name'   => 'ABC',
'email'  => '[email protected]',
'phones' =>
[
'phone' =>
[
[
'mobile' => '9000199193',
'land'   => '9999999',
],
[
'mobile' => '9000199193',
'land'   => '9999999',
],
[
'mobile' => '9000199194',
'land'   => '5555555',
],
[
'mobile' => '9000199195',
'land'   => '8888888',
],
],
],
];

//Specify the $array and a name for the root container
echo array2xml($array, 'contact');

Вы получаете следующие результаты:

<?xml version="1.0" encoding="UTF-8"?>
<contact>
<name>ABC</name>
<email>[email protected]</email>
<phones>
<phone>
<mobile>9000199193</mobile>
<land>9999999</land>
</phone>
<phone>
<mobile>9000199193</mobile>
<land>9999999</land>
</phone>
<phone>
<mobile>9000199194</mobile>
<land>5555555</land>
</phone>
<phone>
<mobile>9000199195</mobile>
<land>8888888</land>
</phone>
</phones>
</contact>

Надеюсь, это поможет.

0

По вопросам рекламы [email protected]