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

Barbara Streisand
リリース: 2024-10-20 15:40:03
オリジナル
477 人が閲覧しました

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

ソース:php
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!