Frage

hier ist Ok mein Dilemma. Ich bin auf der Suche nach einer Möglichkeit, die Daten in einer Gruppe mit SimpleXML in PHP zu konsolidieren. Hier ist, was ich meine.

Lassen Sie uns sagen, dass ich eine XML haben, die wie folgt aussieht:

  <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>

Jetzt ist hier, was ich aussehen soll:

Film

  • Casino Royale - James Bond Bourne
  • Bourne Identität - Jason Bourne

Book

  • Shantaram - Lindsay Ford

Bitte helfen Sie mir !! Lassen Sie uns wissen, wenn etwas verwirrend ist.

War es hilfreich?

Lösung

Wenn Sie nicht wissen, vorab in die Art von Filmen, können Sie:

  • extrahiert alle Typen aus den XML-Daten
    • erhalten sie so einzigartig, da sie mehrfach auftreten können (Es könnte ein Weg sein, mit XPath zu tun, dass, ich es nicht weiß, so werde ich array_unique)
  • iterate über diese Art, mit was @ Mark vorgeschlagen .


So etwas würde dies wahrscheinlich tun:

$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 ;-)

}


Und um die Dinge leichter verständlich zu machen, hier sind die var_dump die Ausgänge:

Var_dump # 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_dump # 2 :

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

Var_dump # 3 :

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

Var_dump # 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)


Jetzt ist es an Ihnen, diese Daten so, wie Sie wollen, zu präsentieren; ein Doppel foreach Schleife konstruieren <ul> und <li> Tags wahrscheinlich tun würde; -)

Andere Tipps

Ich glaube, Sie suchen Xpath:

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

Sie können dann Schleife über $ arrMovies und $ arrBooks und ausdrucken, was Sie brauchen:

foreach($arrMovies as $movie) {
    echo $movie->name;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top