0

xml ファイルからデータを取得するために foreach ループを実行しています。xml ファイルには、同じ日付が複数回リストされており、それぞれが異なるデータを持っています。私がする必要があるのは、各日付を一度だけ表示することです。

基本的に、最初のループで最初の日付 (オブジェクト) を表示するには、foreach ループが必要です。2 番目、3 番目、4 番目のループなどで日付 (オブジェクト) が同じ場合は、そのループをスキップして、日付 ​​(オブジェクト) が同じでない次のループに移動します。ここに私が今持っているものがあります:

$dateResults = $xml->xpath('/rtnshowtime/filmtitle/show[preceding-sibling::shortname="AGOODDAYTODIEHARD"]');
foreach ($dateResults as $dateResult) {
    print_r($dateResult->date);
    echo "<br>";
}

それは以下を生成します:

SimpleXMLElement Object ( [0] => 02152013 ) 
SimpleXMLElement Object ( [0] => 02152013 ) <-- this one needs to be skipped
SimpleXMLElement Object ( [0] => 02152013 ) <-- this one needs to be skipped
SimpleXMLElement Object ( [0] => 02162013 ) 
SimpleXMLElement Object ( [0] => 02162013 ) <-- this one needs to be skipped
SimpleXMLElement Object ( [0] => 02162013 ) <-- this one needs to be skipped
SimpleXMLElement Object ( [0] => 02162013 ) <-- this one needs to be skipped
SimpleXMLElement Object ( [0] => 02162013 ) <-- this one needs to be skipped
SimpleXMLElement Object ( [0] => 02172013 ) 
SimpleXMLElement Object ( [0] => 02172013 ) <-- this one needs to be skipped
SimpleXMLElement Object ( [0] => 02172013 ) <-- this one needs to be skipped
SimpleXMLElement Object ( [0] => 02172013 ) <-- this one needs to be skipped
SimpleXMLElement Object ( [0] => 02172013 ) <-- this one needs to be skipped
SimpleXMLElement Object ( [0] => 02182013 ) 
SimpleXMLElement Object ( [0] => 02182013 ) <-- this one needs to be skipped
SimpleXMLElement Object ( [0] => 02192013 ) 
SimpleXMLElement Object ( [0] => 02192013 ) <-- this one needs to be skipped
SimpleXMLElement Object ( [0] => 02202013 ) 
SimpleXMLElement Object ( [0] => 02202013 ) <-- this one needs to be skipped
SimpleXMLElement Object ( [0] => 02212013 ) 
SimpleXMLElement Object ( [0] => 02212013 ) <-- this one needs to be skipped
4

3 に答える 3

2

日付をキーにして、日付が既に使用されているかどうかを確認するなどの方法を試すことができます。

$dateResults = $xml->xpath('/rtnshowtime/filmtitle/show[preceding-sibling::shortname="AGOODDAYTODIEHARD"]');

$finalResults = array();

foreach ($dateResults as $dateResult) {

    // change your simplexml object to either (int) or (string)
    $date = (int) $dateResult->date;

    // checks key for repeating date
    if (!array_key_exists($date, $finalResults)){
        // assuming you want the entire $dateResult match with date as key
        $finalResults[$date] = $dateResult
    }       

}

//  to print out the results
foreach ( $finalResult as $result ){
    foreach ( $results as $key => $value ){
        echo $key." : ".$value;
    }
}

// or if you know the date and what you want from that array
echo (string) $finalResult[2152013]['salelink']

動作確認はしておりませんので、不具合等ありましたらご連絡ください。

于 2013-02-16T18:24:49.403 に答える
0

日付を配列に追加してから、ループ中に存在を確認できます。

// create array for storing unique dates
$unique_dates = array();

$dateResults = $xml->xpath('/rtnshowtime/filmtitle/show[preceding-sibling::shortname="AGOODDAYTODIEHARD"]');
foreach ($dateResults as $dateResult) 
{
    // need this to get the time attribute from the object
    $time_index = 0;

    // if the date does not exist in unique dates array
    if ( ! in_array($dateResult->date->$time_index, $unique_dates))
    {
        // add to unique dates array
        $unique_dates[] = $dateResult->date->$time_index;

        print_r($dateResult->date);
        echo "<br>";
    }
}
于 2013-02-16T18:26:30.247 に答える
0

わかりました、これが私が選んだものです。

$shortname = $_GET['shortname'];
$dateURL = $_GET['date'];
$use_errors = libxml_use_internal_errors(true);
$xml = simplexml_load_file('XML/showtimes.xml');
if (!$xml) {echo "NO XML loaded<br>";}else{echo "XML IS loaded<br>";}
$results = $xml->xpath('/rtnshowtime/filmtitle[child::shortname="'.$shortname.'"]');

foreach ($results as $result) {
    echo "showtimes for ".$dateURL."<br>";
    foreach ($result->show as $result2) {
        if ($result2->date == $dateURL) {
            echo " -".$result2->time."- ";
        }
    }
}

たとえば、これを生成します:

showtimes for 02152013
 -1300-  -1400-  -1500-  -1600-  -1700- 

$_GET を使用して URL から日付と短い名前を取得し、その短い名前を使用して、xml 内のどの映画を処理するかを決定します。次に、最初の foreach の結果としてそれを生成します。次に、特に日付と時刻を含む子要素を処理する最初の foreach 内で 2 番目の foreach を実行します。次に、if ステートメントを使用して、URL に基づいて処理する日付を分離します。そのifステートメントのため、兄弟の日付が同じである結果内のすべての時間をエコーできます。1300、1400、1500、1600 のような時間をエコーし​​たいのですが、前回の後にカンマはありませんが、その方法がわかりません。implode() を使用してみましたが、毎回エコーが if ステートメント内にあるため、結果は配列ではなくオブジェクトになります。私はそれを仮定します...私は' 用語にあまり精通していません。私は代わりにスペースと - 毎回の前と - と毎回の後のスペースを選択しました。今のところ動作する必要があります。:)

皆さん、ご協力ありがとうございました!スタックオーバーフロー ROCKS!!!

于 2013-02-27T02:56:24.730 に答える