Pregunta

Ok, aquí está mi dilema.Estoy buscando una manera de consolidar los datos en un grupo usando XML simple en PHP.Esto es lo que quiero decir.

Digamos que tengo un xml que se ve así:

  <favorites>
    <interesting>
        <type>Movie</type>
        <character>James Bond</character>
        <name>Casino Royale</name>
    </interesting>
    <interesting>
        <type>Movie</type>
        <character>Jason Bourne</character>
        <name>Bourne Identity</name>
    </interesting>
    <interesting>
        <type>Book</type>
        <character>Lindsay Ford</character>
        <name>Shantaram</name>
    </interesting>
  </favorites>

Ahora así es como quiero que se vea:

Película

  • Casino Royale - James Bond Bourne
  • Identidad Bourne - Jason Bourne

Libro

  • Shantaram - Lindsay Ford

¡¡Por favor, ayúdame!!Avíseme si hay algo confuso.

¿Fue útil?

Solución

Si no conoces de antemano los tipos de películas, podrías:

  • extraer todos los tipos de los datos XML
    • consígalos como únicos, ya que pueden aparecer varias veces (puede haber una manera de hacerlo con XPath;No lo sé, así que lo usaré. array_unique)
  • iterar sobre estos tipos, usando lo que @Mark propuso.


Algo como esto probablemente funcionaría:

$xml = simplexml_load_string($xmlData);

$typesListXml = $xml->xpath('interesting/type');
var_dump($typesListXml);    // var_dump #1

if (!empty($typesListXml)) {
    $typesList = array();
    foreach ($typesListXml as $typeXml) {
        $typesList[] = (string)$typeXml;
    }
    var_dump($typesList);    // var_dump #2

    $typesList = array_unique($typesList);
    var_dump($typesList); // var_dump #3

    $moviesForType = array();
    foreach ($typesList as $type) {
        $rawData = $xml->xpath('interesting[type="' . $type . '"]');
        if (!empty($rawData)) {
            foreach ($rawData as $rawMovie) {
                $moviesForType[$type][] = $rawMovie->name . ' - ' . $rawMovie->character;
            }
        }
    }

    var_dump($moviesForType); // var_dump #4

    // Up to you to present $moviesForType the way you want ;-)

}


Y para que las cosas sean más fáciles de entender, aquí están los resultados de var_dump:

var_volcado #1 :

array
  0 => 
    object(SimpleXMLElement)[2]
      string 'Movie' (length=5)
  1 => 
    object(SimpleXMLElement)[3]
      string 'Movie' (length=5)
  2 => 
    object(SimpleXMLElement)[4]
      string 'Book' (length=4)

var_volcado #2 :

array
  0 => string 'Movie' (length=5)
  1 => string 'Movie' (length=5)
  2 => string 'Book' (length=4)

var_volcado #3 :

array
  0 => string 'Movie' (length=5)
  2 => string 'Book' (length=4)

var_volcado #3 :

array
  'Movie' => 
    array
      0 => string 'Casino Royale - James Bond' (length=26)
      1 => string 'Bourne Identity - Jason Bourne' (length=30)
  'Book' => 
    array
      0 => string 'Shantaram - Lindsay Ford' (length=24)


Ahora depende de usted presentar esos datos de la manera que desee;una construcción de bucle doble foreach <ul> y <li> las etiquetas probablemente servirían ;-)

Otros consejos

Creo que estás buscando Xpath:

$xmlData = '<favorites>...</favorites>';
$xml = simplexml_load_string($xmlData);
$arrMovies = $xml->xpath('interesting[type="Movie"]');
$arrBooks = $xml->xpath('interesting[type="Book"]');

Luego puede recorrer $ arrMovies y $ arrBooks e imprimir lo que necesita:

foreach($arrMovies as $movie) {
    echo $movie->name;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top