[RESOLU] Transformation d'un array à plusieurs dimensions en xml

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] Transformation d'un array à plusieurs dimensions en xml

Re: Transformation d'un array à plusieurs dimensions en xml

par kevin254kl » 28 août 2017, 11:49

Problème résolu, avec

Code : Tout sélectionner

$offsetLot = 0; while (($pos = strpos($xml, '</TransfertVente>', $offsetLot)) !== FALSE) { // Je regarde si mon élément existe dans le xml if (substr($xml, $pos, 24) === '</TransfertVente><IdLot>') {// je descend d'un cran $xml = substr_replace($xml, '</TransfertVente></lots><lots><IdLot>', $pos, 24);// j'ajoute } $offsetLot = $pos + 1; }
Du coup cela me génère plusieurs balise lots.

Transformation d'un array à plusieurs dimensions en xml

par kevin254kl » 28 août 2017, 09:35

Bonjour à tous,

Pourriez vous m'aider?

Voilà je vous explique le problème, j'ai une vente avec plusieurs lots
J'ai repris un programme ou il y a une fonction qui avec un tableau associatif php génère un xml

Code : Tout sélectionner

function array_to_xml($array, &$xml) { foreach ($array as $key => $value) { if (is_array($value)) { if (!is_numeric($key)) { $subnode = $xml->addChild("$key"); array_to_xml($value, $subnode); } else { array_to_xml($value, $xml); } } else { $value = htmlspecialchars($value); $key = htmlspecialchars($key); $xml->addChild("$key", "$value"); } } }
Elle fonctionne très bien. Seul problème le cas ou j'ai plusieurs lots par vente, alors la fonction va me transformer

Code : Tout sélectionner

"lots" => array:3 [▼ 0 => array:34 [▶] 1 => array:34 [▶] 2 => array:34 [▶]
et pas de générer de nœuds pour les lots individuellement logique puisque ce ne sont pas des tableaux associatifs.

Actuellement le tableau est construit comme cela :

Code : Tout sélectionner

foreach ($lots as $lot) { // pour chaque lot if (isset($lot['MandatVente']) && $lot['MandatVente'] === $mandats[$i]->getId()) { if (!isset($tab[$mandats[$i]->getVendeur()->getId()]['lots'])) { $tab[$mandats[$i]->getVendeur()->getId()]['lots'] = []; } array_shift($lot);// j'enlève le lot je l'ai affecté à une vente array_push($tab[$mandats[$i]->getVendeur()->getId()]['lots'], $lot); // j'ajoute le lot } }
Peut on avoir plusieurs lignes avec un même index dans le tableau php, comment je peux contourner le problème une solution propre sans générer des balises <lot1> <lot2>.
J'ai pensé sinon dans le code à faire cela, ou je dirais directement si tu vois la balise <idlot> alors tu m'ajoutes <lot> avant et pour la fermer j'utiliserais la dernière balise entre chaque lot, mais le str_replace transforme le xml en chaine de cractères auriez vous un moyen?

Code : Tout sélectionner

$xml_data = new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8" ?><root></root>'); array_to_xml($tabSV, $xml_data); $xml = $xml_data->asXML(); $xml = str_replace("<IdLot>","<lot><IdLot>", $xml);
Merci de votre aide.