ホームページ >バックエンド開発 >PHPチュートリアル >Iterator と XMLWriter を使用して多次元配列を XML に反復変換する方法

Iterator と XMLWriter を使用して多次元配列を XML に反復変換する方法

Barbara Streisand
Barbara Streisandオリジナル
2024-10-20 15:40:03557ブラウズ

How to Iteratively Transform Multidimensional Arrays into XML with Iterator and XMLWriter

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。