Rumah >pembangunan bahagian belakang >tutorial php >Cara Mengubah Tatasusunan Berbilang Dimensi Secara Berulang kepada XML dengan Iterator dan 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!