<?php
/**
* Эта вспомогательная функция проверяет, является ли массив
* ассоциативным - то есть есть ли в нем строковые ключи
*
* @param array $array
* @return bool
*/
function isAssocArray($array) {
if(!is_array($array)) {
return false;
}
if(count($array) < 1) {
return true;
}
foreach($array as $key => $value) {
if(is_numeric($key)) {
return false;
}
}
return true;
}
/**
* Эта вспомогательная функция генерирует XML-элемент
*
* @param mixed $content Содержимое элемента
* @param string $parent_tag Имя родительского тега на случай, если
*
* @return bool
*/
function generateXmlTagContents($content, $parent_tag = 'WHATTAG') {
if(is_array($content)) {
// Содержимое - массив
if(isAssocArray($content)) {
// Содержимое - массив вида array('id' => ..., 'name' => ...)
return arrayToXml($content);
} else {
// Содержимое - массив вида array(0 => ..., 1 => ...)
$result = '';
foreach($content as $content_value) {
$result .= "<{$parent_tag}>" . generateXmlTagContents($content_value, $parent_tag) . "</{$parent_tag}>";
}
return $result;
}
} else {
// Содержимое - не массив.
$content = (string)$content;
if(preg_match('#[<>&]#', $content)) {
// Если в содержимом есть специальные символы, то его нужно обернуть в <![CDATA[...]]>
return "<![CDATA[{$content}]]>";
}
return $content;
}
}
/**
* Эта функция генерирует XML на основе массива
*
* @param array $array Исходный массив
* @return string Итоговый XML
*/
function arrayToXml(array $array) {
$result = '';
foreach($array as $tag => $content) {
// Сделать $tag (будущее имя тега) маленькими буквами
$tag = strtolower($tag);
// Эта строка вырезает из имени тега все буквы, кроме
// латинского алфавита, дефиса, подчеркивания, двоеточия
// и цифр (эти символы разрешены в именах тегов XML)
// (ну, не только они, на самом деле, но в основном используются они)
$tag = preg_replace('#[^-_:a-z0-9]#', '', $tag);
if(is_array($content) && isAssocArray($content) === false) {
// Если содержимое - это массив с числовыми ключами, то выводить сам тэг
// сейчас не нужно - у каждого элемента он будет свой, сгенерированный
// функцией generateXmlTagContents()
$result .= generateXmlTagContents($content, $tag);
} else {
// В противном случае это обычный элемент, и мы выводим сам тэг, а
// generateXmlTagContents() займется его содержимым.
$result .= "<{$tag}>" . generateXmlTagContents($content, $tag) . "</{$tag}>";
}
}
return $result;
}
?>

What’s your reaction?
Love1
Sad1
Happy1
Sleepy1
Angry1
Dead1
Wink1
Подписаться
0 комментариев
Leave a Reply