2009-07-30 52 views
2

好的,這是我的困境。我正在尋找一種方法來整合使用SimpleXML在PHP中的組中的數據。這是我的意思。PHP SimpleXML Group按元素類型

比方說,我有一個看起來像這樣的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> 

現在,這裏就是我想要的樣子:

電影

  • 皇家賭場 - 詹姆斯·邦德Bourne
  • Bourne Identity - Jason Bourne

  • 項塔蘭 - 林賽·福特

請幫助我!讓我知道是否有任何混淆。

+0

感謝馬克。我忘了提及有很多「類型」的列表,我不想爲每個列表寫xpath,有沒有辦法自動查找「類型」而不是硬編碼值(例如「電影」,「書」)? – jchimpo 2009-07-30 21:46:31

+0

$ arrTypes = $ xml-> xpath('interesting/type');會給你所有的類型。不幸的是,它將是一個simplexml對象的數組。您需要遍歷它並將所有類型放入一個新數組,然後array_unique()新數組。 – Mark 2009-07-30 21:55:52

+0

你能幫我解決這個問題嗎?我是一個n00b。 :(謝謝! – jchimpo 2009-07-30 21:58:26

回答

4

如果你不知道中推進類型的電影,你可以:

  • 提取所有類型從XML數據
    • 讓它們成爲唯一的,因爲它們可能會多次出現(可能有一種方法可以用XPath來實現;我不知道,所以我會用array_unique
  • 迭代這些類型,使用什麼@Mark proposed


像這樣的事情可能會做:

$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>標籤可能會做;-)

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