2012-07-13 38 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