Rumah >pembangunan bahagian belakang >tutorial php >Cara Mengubah Tatasusunan Berbilang Dimensi Secara Berulang kepada XML dengan Iterator dan XMLWriter

Cara Mengubah Tatasusunan Berbilang Dimensi Secara Berulang kepada XML dengan Iterator dan XMLWriter

Barbara Streisand
Barbara Streisandasal
2024-10-20 15:40:03548semak imbas

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

Mengulang Tatasusunan Berbilang Dimensi untuk Transformasi XML

Satu tugas biasa apabila bekerja dengan tatasusunan bersarang atau berbilang dimensi ialah menukarnya kepada struktur XML. Sebagai contoh, pertimbangkan tatasusunan berikut:

$nodes = array(
    "parent node",
    "parent node",
    array(
        "child node",
        "child node",
        array(
            "grand child node",
            "grand child node"
        )
    )
);

Matlamatnya adalah untuk mengubah tatasusunan yang diberikan kepada rentetan XML, seperti:

<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>

Pendekatan Rekursif

Kaedah biasa untuk mengendalikan struktur bersarang adalah melalui rekursi, seperti yang digambarkan di bawah:

<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>

Pendekatan Berulang Menggunakan Iterator

Walau bagaimanapun, alternatif pendekatan adalah menggunakan lelaran dengan Iterator. Ini membolehkan fleksibiliti yang lebih besar dan memudahkan proses:

<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>

Untuk menggunakan iterator, buat seketika dan melintasi tatasusunan:

<code class="php">$iterator = new TranformArrayIterator(new RecursiveArrayIterator($nodes));

foreach ($iterator as $val) {
    echo $val;
}</code>

Pendekatan ini menghasilkan output XML yang setara sebagai rekursif kaedah.

Kolaborasi XMLWriter

Untuk kawalan dan pengesahan XML yang lebih tepat, anda boleh menggunakan XMLWriter dengan kerjasama iterator:

<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>

Iterator ini memberikan kawalan yang lebih halus ke atas struktur XML dan memastikan kesahihannya.

Dengan memanfaatkan kuasa iterator, anda boleh memproses dan mengubah tatasusunan berbilang dimensi kepada struktur XML dengan cekap, menawarkan kedua-dua fleksibiliti dan kawalan untuk pelbagai senario.

Atas ialah kandungan terperinci Cara Mengubah Tatasusunan Berbilang Dimensi Secara Berulang kepada XML dengan Iterator dan XMLWriter. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn