2

一部のXMLをループして、属性値がループの前の反復での値と一致したか一致しなかった場合にアクションを実行しようとしています。

着信データはすでにクラスによってソートされています。

ここにいくつかのサンプルXMLとコードがあります

<character_list>
    <character id="00001">
        <name first="Name1"/>
        <type class="Class A" classid="1"/>
    </character>
    <character id="00002">
        <name first="Name2"/>
        <type class="Class A" classid="1"/>
    </character>
    <character id="00003">
        <name first="Name3"/>
        <type class="Class B" classid="2"/>
    </character>
    <character id="00004">
        <name first="Name4"/>
        <type class="Class B" classid="2"/>
    </character>
    <character id="00005">
        <name first="Name5"/>
        <type class="Class B" classid="2"/>
    </character>
    <character id="00006">
        <name first="Name6"/>
        <type class="Class C" classid="3"/>
    </character>
    <character id="00007">
        <name first="Name7"/>
        <type class="Class D" classid="4"/>
    </character>
    <character id="00008">
        <name first="Name8"/>
        <type class="Class D" classid="4"/>
    </character>
</character_list>

これが私のコードです

<?php
$query = "data.xml";
$xml = file_get_contents($query);

try {
        $dataobj = NEW SimpleXMLElement($xml);
}

catch(Exception $e) {
        echo "Parsing error!  ".$e->getMessage()." in ".basename($e->getFile()).":".$e->getLine()."!";
        exit;
}

$lastclass = 0;

foreach ($dataobj as $xmldata) {

        $currentclass = $xmldata->type['classid'];

        if ($lastclass == $currentclass) {
                echo $xmldata->name['first']." ";
        }
        else
        {
                echo "<br>";
                echo $xmldata->type['class']." - ";
                echo $xmldata->name['first']." ";
        }

        $lastclass = $xmldata->type['classid'];
}


?>

コードからの出力

Class A - Name1 
Class A - Name2 
Class B - Name3 
Class B - Name4 
Class B - Name5 
Class C - Name6 
Class D - Name7 
Class D - Name8

期待される出力

Class A - Name1 Name2 
Class B - Name3 Name4 Name5 
Class C - Name6 
Class D - Name7 Name8

誰かが私が間違っていることとそれを修正する方法を見ることができますか?

4

2 に答える 2

0

とにかくxmlでの物理的な順序に依存するべきではないため、受信データが並べ替えられていないと仮定すると、処理中にすぐに印刷する代わりに、ハッシュまたは配列に格納します。その後、必要に応じてグループで印刷します。

于 2012-11-23T00:59:06.417 に答える
0

次のような文字列に値をキャストするだけです。

foreach ($dataobj as $xmldata) {

    $currentclass = (string) $xmldata->type['classid'];

    if ($lastclass == $currentclass) {
            echo $xmldata->name['first']." ";
    }
    else
    {
            echo "<br>";
            echo $xmldata->type['class']." - ";
            echo $xmldata->name['first']." ";
    }

    $lastclass = (string) $xmldata->type['classid'];
}

キャストせずに、simplexmlオブジェクトを比較しています。

于 2012-11-23T11:10:13.340 に答える