ホームページ >バックエンド開発 >PHPチュートリアル >Iterator と XMLWriter を使用して多次元配列を XML に反復変換する方法
XML 変換のための多次元配列の反復
ネストされた配列または多次元配列を操作する場合の一般的なタスクの 1 つは、それらを XML 構造に変換することです。たとえば、次の配列について考えてみましょう:
$nodes = array( "parent node", "parent node", array( "child node", "child node", array( "grand child node", "grand child node" ) ) );
目的は、指定された配列を次のような XML 文字列に変換することです:
<node> <node>parent node</node> <node>parent node</node> <node> <node>child node</node> <node>child node</node> <node> <node>grand child node</node> <node>grand child node</node> </node> </node> </node>
再帰的アプローチ
入れ子構造を処理する一般的な方法は、以下に示すように、再帰を使用することです。
<code class="php">function traverse($nodes) { echo "<node>"; foreach ($nodes as $node) { if (is_array($node)) { traverse($node); } else { echo "<node>$node</node>"; } } echo "</node>"; }</code>
Iterator を使用した反復アプローチ
ただし、別の方法もあります。アプローチは、Iterator で反復を使用することです。これにより、柔軟性が向上し、プロセスが簡素化されます。
<code class="php">class TranformArrayIterator extends RecursiveIteratorIterator { // Add indentation for each level protected function indent() { echo str_repeat("\t", $this->getDepth()); return $this; } public function beginIteration() { echo '<nodes>', PHP_EOL; } public function endIteration() { echo '</nodes>', PHP_EOL; } public function beginChildren() { $this->indent()->beginIteration(); } public function endChildren() { $this->indent()->endIteration(); } public function current() { return sprintf('%s<node>%s</node>%s', str_repeat("\t", $this->getDepth() + 1), parent::current(), PHP_EOL ); } }</code>
イテレータを使用するには、それをインスタンス化し、配列を走査します。
<code class="php">$iterator = new TranformArrayIterator(new RecursiveArrayIterator($nodes)); foreach ($iterator as $val) { echo $val; }</code>
このアプローチでは、再帰的なものと同等の XML 出力が生成されます。
XMLWriter コラボレーション
より正確な XML 制御と検証のために、XMLWriter を反復子と連携して利用できます。
<code class="php">class TranformArrayIterator extends RecursiveIteratorIterator { private $xmlWriter; public function __construct(XmlWriter $xmlWriter, Traversable $iterator, $mode = RecursiveIteratorIterator::LEAVES_ONLY, $flags = 0) { $this->xmlWriter = $xmlWriter; parent::__construct($iterator, $mode, $flags); } public function beginIteration() { $this->xmlWriter->startDocument('1.0', 'utf-8'); $this->beginChildren(); } public function endIteration() { $this->xmlWriter->endDocument(); } public function beginChildren() { $this->xmlWriter->startElement('nodes'); } public function endChildren() { $this->xmlWriter->endElement(); } public function current() { $this->xmlWriter->writeElement('node', parent::current()); } }</code>
このイテレータは XML 構造をより細かく制御し、その有効性を保証します。
イテレータの機能を活用することで、多次元配列を効率的に処理して XML 構造に変換でき、さまざまなシナリオに柔軟性と制御の両方を提供できます。
以上がIterator と XMLWriter を使用して多次元配列を XML に反復変換する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。