web-dev-qa-db-fra.com

Conversion d'un objet SimpleXML en tableau

Je suis tombé sur cette fonction de conversion d'un objet SimpleXML en 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 pour une chaîne XML ressemble à ceci:

function xmlstring2array($string)
{
    $xml   = simplexml_load_string($string, 'SimpleXMLElement', LIBXML_NOCDATA);

    $array = json_decode(json_encode($xml), TRUE);

    return $array;
}

Cela fonctionne assez bien, mais cela semble un peu hacky? Y at-il un moyen plus efficace/robuste de le faire?

Je sais que l'objet SimpleXML est assez proche d'un tableau car il utilise l'interface ArrayAccess dans PHP mais cela ne fonctionne toujours pas très bien pour être utilisé comme tableau avec des tableaux multidimensionnels, c'est-à-dire en boucle.

Merci à tous pour toute aide

64
Abs

J'ai trouvé cela dans le commentaires du manuel PHP :

/**
 * function xml2array
 *
 * 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  k dot antczak at livedata dot pl
 * @date    2011-04-22 06:08 UTC
 * @link    http://www.php.net/manual/en/ref.simplexml.php#103617
 * @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 xml2array ( $xmlObject, $out = array () )
{
    foreach ( (array) $xmlObject as $index => $node )
        $out[$index] = ( is_object ( $node ) ) ? xml2array ( $node ) : $node;

    return $out;
}

Cela pourrait vous aider. Cependant, si vous convertissez XML en un tableau, vous perdrez tous les attributs pouvant être présents. Vous ne pouvez donc pas revenir en XML et obtenir le même XML.

83
Arjan

Juste (array) est manquant dans votre code avant l’objet simplexml:

...

$xml   = simplexml_load_string($string, 'SimpleXMLElement', LIBXML_NOCDATA);

$array = json_decode(json_encode((array)$xml), TRUE);
                                 ^^^^^^^
...
55
Aleksandr Ryabov