0

XMLサード パーティから提供された を持っていますが、そのフォーマットを制御することはできません。次のようになります。

<base>  
    <results index="1">  
        <quote vendor_name="Company X">  
            <quote_detail rate="3.375" price="-0.440">  
                <stuff>value</stuff>  
            </quote_detail>  
        </quote>  
    </results>  
    <results index="2">  
        <quote vendor_name="Company y">  
            <quote_detail rate="3.548" price="-0.230">  
                <stuff>value</stuff>  
            </quote_detail>  
        </quote>  
    </results>  
    <results index="3">  
        <quote vendor_name="Company Z">  
            <quote_detail rate="3.799" price="1.120">  
                <stuff>value</stuff>  
            </quote_detail>  
        </quote>  
    </results>  
</base>

私がする必要があるのは、上と下の次の 2 つだけでなく、ゼロに最も近い価格を持つ結果 ( vendor_namerateおよび) を返すことです。price理想的な結果は次のようになります (中央の結果がゼロに最も近い)。

  1. Z社 / 3.875 / -1.375
  2. Y社 / 3.750 / -0.875
  3. X社 / 3.375 / -0.440
  4. A社 / 3.500 / 0.250
  5. B社 / 3.375 / 1.125

これを行うために必要なロジックや、そのロジックの実行中に情報を保持する方法についてはわかりませんXML。何か助けはありますか?

4

2 に答える 2

0

XML からデータを解析して、それを処理できるようにする必要があります。次に、データを取得したら、必要な会社を選択できます。

これは、PHPのDOMDocumentクラスを使用したほとんどの実用的なソリューションです。まず、会社を配列に解析することから始めます。

$doc = new DOMDocument;
$doc->loadXML( $xml); // $xml = your string from above

$xpath = new DOMXPath( $doc);

$companies = array();
foreach( $xpath->query('//results') as $result) {
    $quote = $xpath->query( 'quote', $result)->item(0);
    $vendor_name = $quote->attributes->getNamedItem( 'vendor_name')->value;

    $quote_detail = $xpath->query( 'quote_detail', $quote)->item(0);
    $rate = $quote_detail->attributes->getNamedItem( 'rate')->value;
    $price = $quote_detail->attributes->getNamedItem( 'price')->value;

    $companies[] = array( 
        'vendor_name' => $vendor_name,
        'rate' => $rate,
        'price' => $price
    );
}

var_dump( $companies);

これで、次のような会社の配列ができました。

array(3) {
  [0]=>
  array(3) {
    ["vendor_name"]=>
    string(9) "Company X"
    ["rate"]=>
    string(5) "3.375"
    ["price"]=>
    string(6) "-0.440"
  }
  [1]=>
  array(3) {
    ["vendor_name"]=>
    string(9) "Company y"
    ["rate"]=>
    string(5) "3.548"
    ["price"]=>
    string(6) "-0.230"
  }
  [2]=>
  array(3) {
    ["vendor_name"]=>
    string(9) "Company Z"
    ["rate"]=>
    string(5) "3.799"
    ["price"]=>
    string(5) "1.120"
  }
}

次に、価格フィールドで会社のリストを並べ替えます。

usort( $companies, function( $a, $b) { 
    if( $a['price'] == $b['price']) 
        return 0; 
    return $a['price'] < $b['price'] ? -1 : 1;
});

var_dump( $companies);

サンプル データは既に並べ替えられているため、何も実行されません。ただし、どれがゼロに最も近いかを判断するには、並べ替えられた配列が必要です。

ここから、必要な 5 つの要素を選択する方法を理解する必要があります。これは、始めるには必要以上のものだと思います。

于 2012-07-13T15:04:41.757 に答える
0

始めるのに役立つリンクをいくつか投げています。

php オブジェクトで xml データにアクセスするには、 simpleXMLを参照してください。コメントの XQuery ヒントも、この方向性を示しています。

結果をループしながら、賞品の絶対値を配列に保存し、それらをksortで並べ替えることができます。

于 2012-07-13T14:53:24.647 に答える