2009-07-30 11 views
2

ここに私のジレンマがあります。私はSimpleXML in PHPを使用して、グループ内のデータを統合する方法を探しています。ここに私が意味するものがあります。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> 

は今ここに、私はそれが見えるようにしたいものです。

作品

  • カジノ・ロワイヤル - ジェームズ・ボンドボーン
  • ボーンアイデンティティ - ジェイソンボーン

ブック

  • シャンタラム - リンゼイフォード

私を助けてください!混乱していることがあれば教えてください。私はあなたを信じて

+0

ありがとうございます。私は、 "タイプ"の巨大なリストがあることを忘れて、私はそれぞれのためにxpathを書こうとしませんが、自動的に値をハードコーディングする代わりに "タイプ"を見つける方法があります(例えば、 "ムービー"本")? – jchimpo

+0

$ arrTypes = $ xml-> xpath( 'interesting/type');あなたにすべてのタイプを与えます。残念ながら、これはsimplexmlオブジェクトの配列になります。ループしてすべての型を新しい配列に入れ、次に新しい配列をarray_unique()する必要があります。 – Mark

+0

もう少しお手伝いできますか?私はn00bです。お返事ありがとうございます。 – jchimpo

答えて

4

あなたがわからない場合映画の種類を進める、あなた可能性:XMLデータから

  • エキス、すべてのタイプ
    • 数回表示される可能性があるため、それらを一意にしてください(XPathでこれを行う方法があるかもしれません。私はそれを知らないので、私は何@Mark proposed使用して、これらのタイプの上にarray_unique
  • 反復を使用します。このよう


何かがおそらくだろう:

のvar_dump#1

$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の出力です。

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) 


は今、それがするのはあなた次第ですプレゼントをするあなたが望むようにデータを表示します。 <ul><li>タグを構築するダブルforeachループはおそらく;-)

+0

ありがとうございました!あなたは男です! – jchimpo

+0

お楽しみに! –

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

ご協力ありがとうございます。 – jchimpo