Comment convertir le tableau de SimpleXML
Comment puis-je convertir un tableau à une SimpleXML objet en PHP?
- Un tableau de ce à quoi?
- C'est cool: viper007bond.com/2011/06/29/...
Vous devez vous connecter pour publier un commentaire.
Comment puis-je convertir un tableau à une SimpleXML objet en PHP?
Vous devez vous connecter pour publier un commentaire.
court:
résultats dans
les clés et les valeurs sont inversés - vous pu le résoudre qu'avec
array_flip()
avant la array_walk.array_walk_recursive
nécessite PHP 5. vous pouvez utiliserarray_walk
au lieu de cela, mais vous n'obtiendrez pas'stack' => 'overflow'
dans le xml puis.array_flip
ne fonctionnera pas comme il peut pas passer par des tableaux (comme leanother_array
à l'intérieur du tableau principal).array_flip
ne fonctionne que si le tableau ne contient pas de valeurs identiques.another_array
?Ici est php 5.2 code qui va le transformer en tableau de toute la profondeur de document xml:
XML généré serait que:
Bout de code PHP
Documentation sur
SimpleXMLElement::asXML
est utilisé dans cet extrait de codeif($value=='') $value=' '; $object->addChild($key, $value);
dans le dernier else, il retourna <ville></ville><itemN></itemN>
. Cette révision: stackoverflow.com/revisions/5965940/2 a mon vainqueurLes réponses fournies ici seulement convertir le tableau en XML avec les nœuds, vous ne sont pas en mesure de définir les attributs. J'ai écrit une fonction php qui vous permet de convertir un tableau en php et aussi de définir les attributs de nœuds particulier dans le xml. L'inconvénient ici est que vous avez à construire un tableau en particulier avec quelques conventions (uniquement si vous souhaitez utiliser des attributs)
L'exemple suivant vous permet de définir des attributs en XML trop.
La source peut être trouvé ici:
https://github.com/digitickets/lalit/blob/master/src/Array2XML.php
if(!is_array($arr)) {
àif(!is_array($arr) && $arr !== '') {
afin de ne pas ajouter un nouveau nœud de texte pour les cordes à vide et garde donc le raccourci balise vide format c'est à dire'tag'=>''
est<tag/>
au lieu de<tag></tag>
Error establishing a database connection
erreur lors du chargement de la page. Êtes-vous capable de rediffuser la classe quelque part? C'est exactement ce que je recherche, avec la seule exception étant que je ne peux pas accéder à la classe à utiliser.J'ai trouvé toutes les réponses à utiliser trop de code. Voici un moyen facile de le faire:
Ensuite, c'est une simple question d'envoyer le tableau dans la fonction, qui utilise la récursivité, il va gérer un tableau multidimensionnel:
Maintenant $xml contient un bel objet XML basé sur votre tableau de exactement comment vous l'avez écrit.
if ( is_numeric( $key ) ) $key = "numeric_$key";
.$k = (is_numeric($k)) ? 'item' : $k;
à l'intérieur de laforeach()
De PHP 5.4
Autre amélioration: l'
Utilisation:
Voici mon entrée, simple et propre..
De toute façon... j'ai pris onokazu du code (merci!) et ajouté la possibilité d'avoir répété les balises XML, il prend également en charge les attributs, j'espère que quelqu'un le trouve utile!
if (is_numeric($k)) { $i = $k + 1; $child = $xml->addChild("_$i"); array_to_xml($v, $child); }
Je utiliser un couple de fonctions que j'ai écrit tout à l'arrière pour générer le xml pour passer en arrière et en avant à partir de PHP et jQuery etc...
Ni un cadres purement génère une chaîne de caractères qui peut ensuite être utilisé avec SimpleXML (ou les autres)...
Si c'est utile à quelqu'un, merci de l'utiliser 🙂
De l'amour à tous 🙂
Je voulais un code qui permettra de prendre tous les éléments à l'intérieur d'un tableau et de les traiter comme des attributs, et tous les tableaux en tant que sous-éléments.
Donc pour quelque chose comme
Je voudrais obtenir quelque chose comme ceci
D'arriver à ce que le code est ci-dessous, mais être très prudent, c'est récursive et peuvent effectivement causer une stackoverflow 🙂
Vous pouvez ajouter des contrôles pour la longueur de la matrice, de sorte que certains éléments se fixer à l'intérieur de la partie données et non pas comme un attribut.
Basé sur tout le reste ici, les poignées des indices numériques + attributs via les préfixant avec
@
, et pourrait injecter xml pour les nœuds existants:Code
Utilisation
Résultat
Bonus: le Formatage XML
Voici une fonction qui a fait le tour pour moi:
Viens de l'appeler avec quelque chose comme
Vous pouvez utiliser le XMLParser que j'ai été travailler sur.
Dans
J'ai trouvé cette solution pour le problème d'origine
La plupart des réponses ci-dessus sont correctes. Cependant, je suis venu avec cette réponse qui résout le array_walk_recursive problème de compatibilité et aussi les touches numériques de problème. Il a également passé tous les tests que j'ai fait:
J'ai aussi ajouté une classe de test pour ce qui pourront vous être utiles:
autre solution:
SI le tableau est associative et saisies correctement, il serait probablement plus facile de le transformer en xml en premier. Quelque chose comme:
L'autre voie serait de créer votre base xml d'abord, comme
puis pour chaque partie de votre tableau, utiliser quelque chose de similaire à mon texte de la création de boucle et d'utiliser plutôt la simplexml fonctions "addChild" pour chaque nœud de la matrice.
Je vais essayer ça plus tard et de mettre à jour ce post avec les deux versions.
Juste un edit sur une fonction ci-dessus, lorsqu'une touche est numérique, ajouter un préfixe "key_"
Vous pouvez Utiliser la fonction suivante dans votre code directement,
Appeler la fonction avec le premier argument comme votre tableau et le deuxième argument doit être de 1, ce sera augmenté pour une parfaite mise en retrait, et le troisième doit être vrai.
par exemple, si la variable tableau à convertir est $array1 puis,
l'appel, l'appel de fonction doit être encapsulé avec
<pre>
tag.Veuillez voir le source de la page après l'exécution du fichier, parce que le < et > les symboles ne sont pas affichées dans une page html.
Avec FluidXML vous pouvez générer, à partir d'une Tableau PHP, XML pour SimpleXML avec... seulement deux lignes de code.
Un exemple de tableau pourrait être
https://github.com/servo-php/fluidxml
Vous pouvez utiliser xmlrpc_encode pour créer un document xml à partir de la matrice de si une verbose xml n'est pas un problème.
http://www.php.net/xmlrpc_encode
veillez à ce que le xml créé diffère dans le cas où vous utilisez associatif et/ou les touches numériques de la
Ma réponse, bricolant réponses des autres. Cela devrait corriger le défaut de compenser pour les touches numériques:
La
array_to_xml()
fonction suppose que le tableau est composé de touches numériques de la première. Si votre réseau avait un élément initial, vous déposez leforeach()
et$elem
consolidés à partir de laarray_to_xml()
fonction et juste passer$xml
à la place.J'aurais commenté la deuxième plus voté réponse, parce qu'elle ne préserve pas de la structure et génère une mauvaise xml si il est indexé numériquement intérieur des tableaux.
J'ai développé ma propre version basée sur elle, parce que j'avais besoin de convertisseur simple entre json et xml indépendamment de la structure de données. Ma version conserve touche numérique, de l'information et de la structure du tableau d'origine. Il permet de créer des éléments pour la indexé numériquement les valeurs par emballage de valeurs valeur nommée éléments-clés de l'attribut qui contient touche numérique.
Par exemple
array('test' => array(0 => 'some value', 1 => 'other'))
convertit à
<test><value key="0">some value</value><value key="1">other</value></test>
Ma version de array_to_xml -fonction (espérons que cela aide quelqu'un 🙂
Ensemble de la structure XML est défini dans $data Array:
Si vous travaillez dans magento et vous avez ce type de tableau associatif
alors c'est préférable de les convertir en tableau associatif au format xml.Utiliser ce code dans le fichier contrôleur.
J'espère que cela aide à tous.
le suivant traite avec des espaces de noms. Dans ce cas, vous construisez le wrapper pour inclure l'espace de noms des définitions, et la passer dans la fonction. utilisez une virgule pour identifier l'espace de noms.
Test Tableau
Cette fonction renvoie par exemple une liste de <obj>...</obj><obj>...</obj> balises XML pour les indices numériques.
D'entrée:
De sortie:
Ce qui devrait combler tous les besoins communs. Peut-être vous pouvez changer la 3ème ligne:
ou si vous travaillez avec les pluriels se terminant par s:
Vous pouvez le faire par DOM aussi. Veuillez voir ci-dessous le code.
Vous pouvez utiliser Moustache Moteur de Template et de faire d'un Modèle comme:
L'utiliser comme ça en PHP: