PHP Array to XML — Пример обработки массива в файл xml

<?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('#[<>&amp;]#', $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) &amp;&amp; isAssocArray($content) === false) {
			// Если содержимое - это массив с числовыми ключами, то выводить сам тэг
			// сейчас не нужно - у каждого элемента он будет свой, сгенерированный
			// функцией generateXmlTagContents()
			$result .= generateXmlTagContents($content, $tag);
		} else {
			// В противном случае это обычный элемент, и мы выводим сам тэг, а
			// generateXmlTagContents() займется его содержимым.
			$result .= "<{$tag}>" . generateXmlTagContents($content, $tag) . "</{$tag}>";
		}

	}

	return $result;
}

?>

Оставить комментарий

avatar
  Подписаться  
Уведомление о