PHP5:从XML返回与搜索值最接近的5个结果
我有一个由第三方提供的PHP5:从XML返回与搜索值最接近的5个结果,php,xml,xml-parsing,Php,Xml,Xml Parsing,我有一个由第三方提供的XML,我无法控制它的格式。看起来是这样的: <base> <results index="1"> <quote vendor_name="Company X"> <quote_detail rate="3.375" price="-0.440"> <stuff>value</stuff>
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\u name
、rate
和price
),该结果的价格接近于零,而不经过上下两步。理想结果如下所示(中间一个最接近于零):
我不确定执行此操作所需的逻辑,也不确定在运行所述逻辑时如何保存
XML
信息。有什么帮助吗?我只是想给你一些链接,帮助你开始
请查看如何使用php对象访问xml数据。
注释中的XQuery提示也向您指出了这个方向
在循环浏览结果时,您可以将奖品的绝对值保存在一个数组中,并对其进行排序。您需要做的是从XML中解析数据,以便能够使用它。然后,一旦你有了数据,你就可以选择你需要的公司 下面是一个使用PHP类的主要工作解决方案。首先,首先将公司解析为一个数组:
$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);
usort($companys,function($a,$b){
如果($a['price']=$b['price'])
返回0;
返回$a[“价格”]<$b[“价格”]?-1:1;
});
var_dump($公司);
您的示例数据已经排序,因此最终什么也不做。但是,您需要一个排序数组来确定哪些数组最接近零
从这里开始,您必须了解如何选择所需的5个元素。我认为这已经超出了开始的需要。A公司不是比X公司更接近于零吗?不知道是否可以对XML进行排序,但可以将其放入数组中,
ksort
it并输出前5个变量。@dainisaols建议一个好的开始,我认为这个问题不属于这里。你给出了一个起点,一个期望的终点,但是在你可以使用的解决方案之间没有任何努力。这个问题可能会帮助你。这不是一个答案,也不会给评论中没有说明的问题增加任何价值。@nickb,你是对的。除了使用绝对值的提示之外,没有什么新的。如果需要与0最接近的价格值并考虑负值,则需要在比较函数中使用abs($price)。否则,您将在排序的数组中找到最小的负值。这将是完整的工作解决方案,我没有说我正在生成:)OP可以完成一些工作。