ホームページ > バックエンド開発 > PHPチュートリアル > PHP は配列を再帰的に解析して XML 問題を生成します。助けてください

PHP は配列を再帰的に解析して XML 問題を生成します。助けてください

WBOY
リリース: 2016-06-23 13:58:53
オリジナル
1041 人が閲覧しました

私の基本的なアイデアは、配列を走査し、現在の要素に "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);
ログイン後にコピー

生成された XML が間違っているのはなぜですか?写真のようにアイテムが外に飛び出しました


ディスカッションへの返信(解決策)

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();    }  }}
ログイン後にコピー
にカプセル化され、writeXml($config) と呼ばれます。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート