Итак, вы хотите, чтобы преобразовать эту структуру данных дерева:
<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
)
С этим я могу пройти его с Еогеасп и выяснить, тег и его содержимое. Я могу проверить, являются ли содержимое строками или дочерними элементами, и если они их прогуливают. Рекурсивная функция сделает довольно короткую работу по этой проблеме. Самая большая проблема заключается в том, как представлять данные, как только они сглаживаются.
Если вы сгладили его в примере массива, который я предоставил ранее, родительский и дочерний теги освобождают любые подразумеваемые отношения друг к другу. Если это не проблема, отлично. Напишите рекурсивную функцию, и все готово. Вот некоторые 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.
Однако, если вам нужно каким-то образом сохранить эти отношения нетронутыми у вас есть небольшая проблема, и нужно будет разработать какой-то схемы для этого
Вы спрашиваете нас, как использовать молоток для приведения винта. Другими словами, вместо того, чтобы описывать, как вы хотите что-то делать, спросите о * how *, чтобы делать что-то. Почему вы хотите иметь такой массив несоответствующих тегов? –
Да, похоже, вы пытаетесь сгладить структуру данных во что-то другое. –