私の基本的なアイデアは、配列を走査し、現在の要素に "childs" という名前のサブ配列があるかどうかを判断することです。そうである場合は、この関数を再帰的に実行します
$config = array( 'root' => array( 'childs' => array( 'body' => array( 'childs' => array( 'scroller' => array( 'childs' => array( 'header' => array( 'childs' => array( 'simpleHeader' => array( 'childs' => array( 'a' => array() ) ) ) ), 'items' => array( 'childs' => array( 'fuck' => array( 'childs' => array( 'b' => array() ) ) ) ) ) ) ) ) ) ));header("Content-type:text/xml;Charset=UTF-8");$xml = new XMLWriter();$xml->openUri('php://output');$xml->startDocument('1.0', 'UTF-8');$xml->setIndent(true);function writeXml($array){ global $xml; foreach($array as $key => $value){ $xml->startElement($key); if( isset($value['childs']) && is_array($value['childs']) && count($value['childs']) > 0 ){ writeXml($value['childs']); } $xml->endElement(); } $xml->endDocument(); $xml->flush();}writeXml($config);
if判定の論理問題、詳しく見てみることができます
php SPLにはリカーサーがあり、より簡単に書くことができます
Put
$xml->endDocument();
$xml->flush();
writeXml 関数を移動して、最後に
....writeXml($config);$xml->endDocument();$xml->flush();
Put
$xml->endDocument(); xml->flush();
writeXml 関数を移動して、最後に実行します
....writeXml($config);$xml->endDocument();$xml->flush();
function writeXml($array, $xml=null){ if(! $xml) { header("Content-type:text/xml;Charset=UTF-8"); $xml = new XMLWriter(); $xml->openUri('php://output'); $xml->startDocument('1.0', 'UTF-8'); $xml->setIndent(true); writeXml($array, $xml); $xml->endDocument(); $xml->flush(); }else { foreach($array as $key => $value){ $xml->startElement($key); if( isset($value['childs']) && is_array($value['childs']) && count($value['childs']) > 0 ){ writeXml($value['childs'], $xml); } $xml->endElement(); } }}