Я знаю, как преобразовать XML в многомерный массив PHP, я делаю это так:
$xml = file_get_contents('data.xml');
$data = json_decode(json_encode((array) simplexml_load_string($xml)),1);
Сейчас $data
мой массив PHP
Но что, если я изменил этот массив и захочу вернуть его обратно в файл? Я должен быть в состоянии сделать противоположное право? Но я не могу узнать, как ..
Этот пост подходит близко, но не возвращает данные в том же порядке: Как преобразовать массив в SimpleXML
И это не должно быть так сложно, не так ли? Конвертировать многомерный массив в XML
Обойдите массив и поместите его в XML с помощью простых операций dom. Или, для старой школы, пройдите цикл, объединяющий XML в строку типа. $xmlstring .= '<tag>' . $arr[x][y] .'</tag>'
а затем загрузить результат в Simplexml с simplexml_load_string
,
Но лучшее, что нужно сделать, это не переключитесь с использования simplexml на массив, если вы собираетесь внести изменения и сохранить XML снова. Пройдите по XML-файлу с помощью DOM simplexml, а не конвертируйте его в массив. Тогда любые изменения, которые вы делаете с DOM, вы можете сохранить без необходимости конвертировать туда и обратно.
У меня была такая же проблема и проблемы с поиском просто решение. Приведенное ниже решение использует 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>
Надеюсь, это поможет.