首頁  >  文章  >  後端開發  >  如何使用 Iterator 和 XMLWriter 將多維數組迭代轉換為 XML

如何使用 Iterator 和 XMLWriter 將多維數組迭代轉換為 XML

Barbara Streisand
Barbara Streisand原創
2024-10-20 15:40:03478瀏覽

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

迭代多維數組進行 XML 轉換

使用巢狀或多維數組時的一個常見任務是將它們轉換為 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>

處理巢狀結構的常用方法是透過遞歸,如下所示:

使用迭代器的迭代方法
<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 協作
<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 控制與驗證,您可以使用XMLWriter 與迭代器合作:

此迭代器可以更好地控制XML 結構並確保其有效性。 透過利用迭代器的強大功能,您可以有效地處理多維數組並將其轉換為 XML 結構,為各種場景提供靈活性和控制性。

以上是如何使用 Iterator 和 XMLWriter 將多維數組迭代轉換為 XML的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn