2012-07-13 41 views
0

返回最接近5個結果搜索值我有一個由第三方提供的XML和我有過它的格式沒有控制權。它看起來像這樣:PHP 5:從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> 

我需要做的是返回擁有但不超過以及高於和低於接下來的兩個最接近零價格的結果(vendor_namerateprice)。理想的結果會是這個樣子(其中中間的一個是最接近零):

  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信息,同時運行所述邏輯。任何幫助?

+1

是不是公司A比公司X更接近於零? – 2012-07-13 14:29:37

+0

不知道如果你可以對XML進行排序,但你可以把它放在一個數組中,'ksort'它並輸出前5個變量。 – Peon 2012-07-13 14:30:01

+1

@DainisAbols建議一個好的開始,我不認爲這個問題屬於這裏。你給出一個起點,一個期望的結束,但是在 – allen213 2012-07-13 14:34:19

回答

0

我只是拋出一些鏈接給你,以幫助你開始。

請看simpleXML用PHP對象訪問XML數據。 您的評論中的XQuery提示也指向了這個方向。

,同時通過你的結果循環,可以爲您節省獎品的絕對值在一個陣列,並將它們與ksort排序。

+0

這不是一個答案,也沒有增加任何價值的問題,尚未在評論中說明。 – nickb 2012-07-13 14:58:23

+0

@nickb,你說得對。除了使用絕對值的提示之外,沒有什麼新的。 – 2012-07-13 15:09:25

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個元素。我認爲這超出了開始所需的程度。

+0

如果您需要將最接近的價格值設爲0並考慮負值,則需要在比較函數中使用abs($ price)。否則你會在你的排序數組中找到最低的負值。 – 2012-07-13 15:11:54

+0

這將是完整的工作解決方案,我沒有說我正在生產:) OP可以做*一些*的工作。 – nickb 2012-07-13 15:22:08