La conversion d'un Objet SimpleXML pour un Tableau
Je suis tombé sur cette fonction de conversion d'un Objet SimpleXML pour un tableau ici:
/**
* function object2array - A simpler way to transform the result into an array
* (requires json module).
*
* This function is part of the PHP manual.
*
* The PHP manual text and comments are covered by the Creative Commons
* Attribution 3.0 License, copyright (c) the PHP Documentation Group
*
* @author Diego Araos, diego at klapmedia dot com
* @date 2011-02-05 04:57 UTC
* @link http://www.php.net/manual/en/function.simplexml-load-string.php#102277
* @license http://www.php.net/license/index.php#doc-lic
* @license http://creativecommons.org/licenses/by/3.0/
* @license CC-BY-3.0 <http://spdx.org/licenses/CC-BY-3.0>
*/
function object2array($object)
{
return json_decode(json_encode($object), TRUE);
}
Donc mon adoption d'une des chaînes XML est comme:
function xmlstring2array($string)
{
$xml = simplexml_load_string($string, 'SimpleXMLElement', LIBXML_NOCDATA);
$array = json_decode(json_encode($xml), TRUE);
return $array;
}
Il fonctionne très bien, mais il semble un peu hacky? Est-il plus efficace/bon moyen de faire cela?
Je sais que l'Objet SimpleXML est assez proche d'un tableau car il rend l'utilisation de l'interface ArrayAccess en PHP mais ça ne fonctionne toujours pas grand pour l'utiliser comme un tableau avec des multi-dimensions des tableaux c'est à dire en boucle.
Merci à tous pour toute l'aide
- Quelle est la raison? Est-il en boucle? Parce que dans ce cas, vous devriez être en mesure de boucle de parties de l'objet SimpleXMLElement sans aucun problème. Par exemple, si vous êtes l'analyse d'un flux ATOM avec SimpleXML vous seriez en mesure de faire ce qui suit:
foreach($xml->entry as $entry)
et ensuite accéder à$entry->title
et.c. à partir de l'intérieur de la boucle. - Notez que l'ajout d'
(array)
à la ci-dessus (c'est à dire@json_decode(@json_encode((array)$simple_xml_object ), 1);
) comme indiqué dans un commentaire plus tard dans le manuel PHP peut provoquerNode no longer exists
erreurs. - c'est quoi cette question? json_encode ne l'arbre transversal sur l'élément simplexml. De quoi vous attendiez-vous différemment? Comment définissez-vous "un peu hacky"? Ce n'est pas robuste avec cette approche dans vos yeux? Ce n'est pas efficace?
- Cette question est clair pour moi, donc je vous recommande de le rouvrir.
Vous devez vous connecter pour publier un commentaire.
J'ai trouvé ça dans le Manuel PHP commentaires:
Il pourrait vous aider. Toutefois, si vous convertir XML en un tableau, vous perdrez tous les attributs qui pourraient être présents, de sorte que vous ne pouvez pas revenir à XML et obtenir le même XML.
SimpleXMLElement
s. C'est parce queis_object($node)
retournefalse
pour les objets enfants, c'est à diregettype($node)
à l'intérieur de second récursivité est"array"
. Un plus méthode correcte est le commentaire juste en dessous. La deuxième méthode comporte certaines implications sur les performances par rapport à la première (d'origine) de l'un et de et de contre la méthode json: codepad.viper-7.com/eHhSNR, ce qui rend json méthode utilisable de nouveau en terme de performanceSimpleXMLElement
s. Malgré qu'elle peut être fixée à l'aide de$out[$index] = is_object($node) || is_array($node) ? xml2array($node) : $element;
Donc il va aller plus loin, même si c'est un tableauJuste
(array)
est manquant dans votre code avant de l'objet simplexml:json_**code
. Utilisez simplement(object) (array) $xml
et c'est fait! 😉json_**
pour obtenir un tableau va produire des résultats différents selon le nombre d'objets enfants (un vs plusieurs).