Maison  >  Article  >  développement back-end  >  Comment transformer de manière itérative des tableaux multidimensionnels en XML avec Iterator et XMLWriter

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

Barbara Streisand
Barbara Streisandoriginal
2024-10-20 15:40:03483parcourir

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"
        )
    )
);

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>

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>

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>

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>

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>

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!

Déclaration:
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