Comment transformer de manière itérative des tableaux multidimensionnels en XML avec Iterator et XMLWriter

Barbara Streisand
Libérer: 2024-10-20 15:40:03
original
477 Les gens l'ont consulté

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

Itération de tableaux multidimensionnels pour la transformation XML

Une tâche courante lorsque l'on travaille avec des tableaux imbriqués ou multidimensionnels consiste à les convertir en une structure XML. Par exemple, considérons le tableau suivant :

$nodes = array(
    "parent node",
    "parent node",
    array(
        "child node",
        "child node",
        array(
            "grand child node",
            "grand child node"
        )
    )
);
Copier après la connexion

Le but est de transformer le tableau donné en une chaîne XML, telle que :

<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>
Copier après la connexion

Approche récursive

Une méthode courante pour gérer les structures imbriquées est la récursion, comme illustré ci-dessous :

<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>
Copier après la connexion

Approche itérative utilisant Iterator

Cependant, une alternative L’approche consiste à utiliser l’itération avec un itérateur. Cela permet une plus grande flexibilité et simplifie le processus :

<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>
Copier après la connexion

Pour utiliser l'itérateur, instanciez-le et parcourez le tableau :

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

foreach ($iterator as $val) {
    echo $val;
}</code>
Copier après la connexion

Cette approche produit une sortie XML équivalente à celle récursive méthode.

Collaboration XMLWriter

Pour un contrôle et une validation XML plus précis, vous pouvez utiliser un XMLWriter en collaboration avec l'itérateur :

<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>
Copier après la connexion

Cet itérateur donne un contrôle plus précis sur la structure XML et garantit sa validité.

En tirant parti de la puissance des itérateurs, vous pouvez traiter et transformer efficacement des tableaux multidimensionnels en structures XML, offrant à la fois flexibilité et contrôle pour une variété de scénarios.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!