迭代多维数组进行 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 协作
为了更精确的 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中文网其他相关文章!