Comment convertir un tableau en objet SimpleXML en PHP ?
Réponses
Trop de publicités?function array2xml($array, $xml = false){
if($xml === false){
$xml = new SimpleXMLElement('<?xml version=\'1.0\' encoding=\'utf-8\'?><'.key($array).'/>');
$array = $array[key($array)];
}
foreach($array as $key => $value){
if(is_array($value)){
$this->array2xml($value, $xml->addChild($key));
}else{
$xml->addChild($key, $value);
}
}
return $xml->asXML();
}
Ma réponse, en rassemblant les réponses des autres. Cela devrait corriger l'échec de la compensation des touches numériques :
function array_to_xml($array, $root, $element) {
$xml = new SimpleXMLElement("<{$root}/>");
foreach ($array as $value) {
$elem = $xml->addChild($element);
xml_recurse_child($elem, $value);
}
return $xml;
}
function xml_recurse_child(&$node, $child) {
foreach ($child as $key=>$value) {
if(is_array($value)) {
foreach ($value as $k => $v) {
if(is_numeric($k)){
xml_recurse_child($node, array($key => $v));
}
else {
$subnode = $node->addChild($key);
xml_recurse_child($subnode, $value);
}
}
}
else {
$node->addChild($key, $value);
}
}
}
Le site array_to_xml()
suppose que le tableau est d'abord constitué de touches numériques. Si votre tableau avait un élément initial, vous laisseriez tomber la fonction foreach()
et $elem
les déclarations du array_to_xml()
et passer simplement la fonction $xml
à la place.
J'aurais commenté la deuxième réponse la plus votée, car elle ne préserve pas la structure et génère un mauvais xml s'il y a des tableaux internes indexés numériquement.
J'ai développé ma propre version basée sur celle-ci, car j'avais besoin d'un convertisseur simple entre json et xml, quelle que soit la structure des données. Ma version préserve les informations des clés numériques et la structure du tableau original. Elle crée des éléments pour les valeurs indexées numériquement en enveloppant les valeurs dans des éléments nommés valeur avec l'attribut key qui contient la clé numérique.
Par exemple
array('test' => array(0 => 'some value', 1 => 'other'))
se convertit en
<test><value key="0">some value</value><value key="1">other</value></test>
Ma version de la fonction array_to_xml (j'espère que cela aidera quelqu'un :)
function array_to_xml($arr, &$xml) {
foreach($arr as $key => $value) {
if(is_array($value)) {
if(!is_numeric($key)){
$subnode = $xml->addChild("$key");
} else {
$subnode = $xml->addChild("value");
$subnode->addAttribute('key', $key);
}
array_to_xml($value, $subnode);
}
else {
if (is_numeric($key)) {
$xml->addChild("value", $value)->addAttribute('key', $key);
} else {
$xml->addChild("$key",$value);
}
}
}
}
Toute la structure XML est définie dans le tableau $data :
function array2Xml($data, $xml = null)
{
if (is_null($xml)) {
$xml = simplexml_load_string('<' . key($data) . '/>');
$data = current($data);
$return = true;
}
if (is_array($data)) {
foreach ($data as $name => $value) {
array2Xml($value, is_numeric($name) ? $xml : $xml->addChild($name));
}
} else {
$xml->{0} = $data;
}
if (!empty($return)) {
return $xml->asXML();
}
}
6 votes
Un tableau de quoi ?
1 votes
C'est cool : viper007bond.com/2011/06/29/…