所以,你要這棵樹的數據結構轉換:
<total>
<tag>content</tag>
<tag2 ref="333">
<code>somecode</code>
<code>morecode</code>
</tag2>
<tag3> more code </tag3>
</total>
成某種平板陣列的:
Array
(
[0] => "<tag>content</tag>"
[1] => "<tag2 ref="333"></tag2>"
[2] => "<code>somecode</code>"
[3] => "<code>morecode</code>
[4] => "<tag3> more code </tag3> "
)
將是棘手的。這是一個經典的CS問題,沒有很多好的回答者。樹結構提供了關於平面數組或列表不包含的條目之間的關係的信息。任何試圖將樹平鋪到列表中的操作都會失去參考上下文。
您可以將字符串分解,然後遍歷它以跟蹤父元素或忽略它們(請參閱tag2)。如果我不得不做的事XML我會放棄它在一個SimpleXMLElement,這會產生這樣的:
SimpleXMLElement Object
(
[tag] => content
[tag2] => SimpleXMLElement Object
(
[@attributes] => Array
(
[ref] => 333
)
[code] => Array
(
[0] => somecode
[1] => morecode
)
)
[tag3] => more code
)
有了這個,我可以用foreach走,並找出標籤和它的內容。我可以測試一下,看看內容是字符串還是子元素,如果是這樣的話。遞歸函數會使這個問題變得相當短暫。最大的問題是如何在數據變平時表示數據。
如果你將它壓扁到前面提供的數組示例中,那麼父和子標籤之間就會有任何隱含的關係。如果這不是問題,那很好。編寫遞歸函數,就完成了。下面是一些psudocode:
function walking($content)
$out is the array chunk that is returned
foreach $content as $tag->$data
if $value is an SimpleXMLElement
collapse $data[@attributes] into a string $attributes
append <$tag $attributes></$tag> to the end of $out
you may need to remove @attributes before recursing.
recurse into walking($data) and append the returned array to the end of $out
if $value is an Array
append <$tag></$tag> to the end of $out
recurse into walking($data) and append the returned array to the end of $out
if $value is a string
append <$tag>$value</$tag> to the end of $out
after looping through $content return $out.
不過,如果你需要以某種方式讓那些關係完好你有一點問題,需要設計出某種方案爲
你在問我們如何用錘子來驅動螺絲。換句話說,不要描述你想做什麼事情,而是要詢問如何做事情。爲什麼你想要有這樣一組不匹配的標籤? – 2009-10-30 22:11:04
是的,它似乎確實想要將數據結構扁平化爲其他東西 – 2009-11-03 23:07:14