2

好的,这是我的困境。我正在寻找一种方法来使用PHP 中的 SimpleXML将数据合并到一个组中。这就是我的意思。

假设我有一个如下所示的 xml:

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

现在这就是我想要的样子:

电影

  • 皇家赌场 - 詹姆斯邦德伯恩
  • 伯恩身份 - 杰森伯恩

  • Shantaram - 林赛福特

请帮我!!让我知道是否有任何令人困惑的地方。

4

2 回答 2

4

如果您事先不知道电影的类型,您可以:

  • 从 XML 数据中提取所有类型
    • 让它们独一无二,因为它们可能会出现多次(可能有一种方法可以使用 XPath 做到这一点;我不知道,所以我会使用array_unique
  • 使用@Mark 提议的内容迭代这些类型。


这样的事情可能会做:

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

}


为了让事情更容易理解,这里是 var_dump 的输出:

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)


现在,由您决定以您想要的方式呈现这些数据;一个双 foreach 循环构造<ul><li>标签可能会做;-)

于 2009-07-30T22:01:06.037 回答
1

我相信您正在寻找 Xpath:

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

然后,您可以遍历 $arrMovies 和 $arrBooks 并打印出您需要的内容:

foreach($arrMovies as $movie) {
    echo $movie->name;
}
于 2009-07-30T21:34:34.080 回答