Skip to content

Instantly share code, notes, and snippets.

@svebal
Forked from derpixler/modifier.parseXML.php
Created June 10, 2011 05:55
Show Gist options
  • Save svebal/1018303 to your computer and use it in GitHub Desktop.
Save svebal/1018303 to your computer and use it in GitHub Desktop.
Smarty Modifier parseXML to Array
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage PluginsModifier
*/
/**
* Smarty {$xml|parseXML} function plugin
*
* Type: modifier<br>
* Name: parseXML<br>
* Purpose: parseXML
* @author Rene Reimann | xananax@yelostudio.com
* @link http://www.php.net/manual/en/book.simplexml.php#98077
*
* @param object $xml template object
* @return array
*/
function smarty_modifier_parseXML($xml)
{
$xmlarray = simpleXMLToArray($xml);
return $xmlarray;
}
/**
* Converts a simpleXML element into an array. Preserves attributes and everything.
* You can choose to get your elements either flattened, or stored in a custom index that
* you define.
* For example, for a given element
* <field name="someName" type="someType"/>
* if you choose to flatten attributes, you would get:
* $array['field']['name'] = 'someName';
* $array['field']['type'] = 'someType';
* If you choose not to flatten, you get:
* $array['field']['@attributes']['name'] = 'someName';
* _____________________________________
* Repeating fields are stored in indexed arrays. so for a markup such as:
* <parent>
* <child>a</child>
* <child>b</child>
* <child>c</child>
* </parent>
* you array would be:
* $array['parent']['child'][0] = 'a';
* $array['parent']['child'][1] = 'b';
* ...And so on.
* _____________________________________
* @param simpleXMLElement $xml the XML to convert
* @param boolean $flattenValues Choose wether to flatten values or to set them under a particular index. defaults to true;
* @param boolean $flattenAttributes Choose wether to flatten attributes or to set them under a particular index. Defaults to true;
* @param boolean $flattenChildren Choose wether to flatten children or to set them under a particular index. Defaults to true;
* @param string $valueKey index for values, in case $flattenValues was set to false. Defaults to "@value"
* @param string $attributesKey index for attributes, in case $flattenAttributes was set to false. Defaults to "@attributes"
* @param string $childrenKey index for children, in case $flattenChildren was set to false. Defaults to "@children"
* @return array the resulting array.
*/
function simpleXMLToArray($xml, $flattenValues=true, $flattenAttributes = true, $flattenChildren=true, $valueKey='@value', $attributesKey='@attributes', $childrenKey='@children'){
$return = array();
if(!($xml instanceof SimpleXMLElement)){return $return;}
$name = $xml->getName();
$_value = trim((string)$xml);
if(strlen($_value)==0){$_value = null;};
if($_value!==null){
if(!$flattenValues){$return[$valueKey] = $_value;}
else{$return = $_value;}
}
$children = array();
$first = true;
foreach($xml->children() as $elementName => $child){
$value = simpleXMLToArray($child, $flattenValues, $flattenAttributes, $flattenChildren, $valueKey, $attributesKey, $childrenKey);
if(isset($children[$elementName])){
if($first){
$temp = $children[$elementName];
unset($children[$elementName]);
$children[$elementName][] = $temp;
$first=false;
}
$children[$elementName][] = $value;
}
else{
$children[$elementName] = $value;
}
}
if(count($children)>0){
if(!$flattenChildren){$return[$childrenKey] = $children;}
else{$return = array_merge($return,$children);}
}
$attributes = array();
foreach($xml->attributes() as $name=>$value){
$attributes[$name] = trim($value);
}
if(count($attributes)>0){
if(!$flattenAttributes){$return[$attributesKey] = $attributes;}
else{$return = array_merge($return, $attributes);}
}
return $return;
}
?>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment