1

ShowsandSeasonsを含むxmlファイルがあります。

私がやろうとしているのは、1つのショーの季節を読み取ることです。しかし、問題は、各シーズンが同じショーの下で複数回表されることです。

次のように、各シーズン番号を1回だけ印刷します。

Season 1
Season 2

しかし、私が今得たのは:

Season 1
Season 2
Season 2
Season 1
Season 1

私のxmlは次のようになります

<?xml version="1.0"?>
<episodeview>
<episodeview>
    <idShow>1</idShow>
    <idSeason>1</idSeason>
</episodeview>
<episodeview>
    <idShow>1</idShow>
    <idSeason>2</idSeason>
</episodeview>
<episodeview>
    <idShow>1</idShow>
    <idSeason>2</idSeason>
</episodeview>
<episodeview>
    <idShow>1</idShow>
    <idSeason>1</idSeason>
</episodeview>
<episodeview>
    <idShow>1</idShow>
    <idSeason>1</idSeason>
</episodeview>
</episodeview>

そして私のphpファイル:

<?php
$idShow = "1";
$source = "show.xml";

$xmlstr = file_get_contents($source);
$xmlcont = new SimpleXMLElement($xmlstr);
foreach($xmlcont as $url) {
    if ($url->idShow == $idShow) {
        $test = $url->idSeason;
        echo "Season ";
        echo $test;
        echo "<br>";
     }      
}

?>

4

3 に答える 3

3

これを試してみてください、短くて甘い:

 $xml=simplexml_load_file($source); // (1)

 foreach ($xml->xpath("//idSeason") As $season) { // (2)

      $s[(int)$season]=$season; // (3)
 }

 foreach ($s As $a) echo "Season $a<br />"; // (4)
  1. simplexmlファイルから-Elementを取得します

  2. <idSeason>のみを使用してノードを選択し、xpathそれらを反復処理します

  3. $sインデックスおよび値としてseason-idを使用して新しい配列を作成します->array-indexは一意である必要があるため、重複したIDは配列を拡大しませんが、インデックスがすでに存在する場合は「上書き」します。

  4. 繰り返して$sエコーします

によって一意の値しか選択できないことは承知していますxpathが、私はそれほど熟練していません;-)そしてsimplexmlはより簡単なxpath2.0をサポートしていません。

于 2013-02-26T22:28:44.057 に答える
1

試す:

<?php
$idShow = "1";
$source = "show.xml";
$have = array();

$xmlstr = file_get_contents($source);
$xmlcont = new SimpleXMLElement($xmlstr);
foreach($xmlcont as $url) {
    if ($url->idShow == $idShow) {
        $test = $url->idSeason;
         if( ! in_array( $test, $have) ){ //Check if the season already is displayed
           echo "Season ";
           echo $test;
           echo "<br>";
           $have[] = $test; //Store the season in the array
          }
     }      
}

このようにして、表示したすべてのものを配列に格納し、testを出力する前に、それがすでに表示されているかどうかを確認します。

于 2013-02-26T22:21:52.910 に答える
1

私はこのようにそれについて行きます:

<?php
  $idShow = "1";
  $source = "show.xml";

  $xmlstr  = file_get_contents($source);
  $xmlcont = new SimpleXMLElement($xmlstr);
  $seasons = array();
  foreach($xml_cont as $url){ $seasons[] = $url->idSeason; }

  $seasons = array_uniq($seasons);

  foreach($seasons as $season){ echo "Season $season <br />"; } 
?>

確かに、私の例には、他のいくつかのソリューションよりも多くのループが含まれていますが、それはかなり効率的で、おそらく同じくらい重要なことですが、読みやすいと思います。

于 2013-02-26T22:38:39.450 に答える