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
),该结果的价格接近于零,而不经过上下两步。理想结果如下所示(中间一个最接近于零):

  • 公司Z/3.875/-1.375
  • 公司Y/3.750/-0.875
  • 公司X/3.375/-0.440
  • 公司A/3.500/0.250
  • 公司B/3.375/1.125

  • 我不确定执行此操作所需的逻辑,也不确定在运行所述逻辑时如何保存
    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可以完成一些工作。