如何生成正确的if语句以从xml文件中筛选出值


How to make a correct if-statement to filter out values from a xml-file

编辑3:

根据要求,我正在努力简化我的问题。

以下是我的一些xml文件中的数据示例:

<entry>
    <title>Entry 1</title>
    <f:max_value_a>499 999</f:max_value_a>
    <f:max_value_b>999 999</f:max_value_b>
    <f:min_value_a>0</f:min_value_a>
    <f:min_value_b>500 000</f:min_value_b>
    <f:min_value_c>1 000 000</f:min_value_c>
    <f:value_for_a>5,10</f:value_for_a>
    <f:value_for_b>4,50</f:value_for_b>
    <f:value_for_c>3,90</f:value_for_c>
</entry>    

<entry>
    <title>Entry 2</title>
    <f:min_value_a>0</f:min_value_a>
    <f:value_for_a>4,20</f:value_for_a>
</entry>
<entry>
    <title>Entry 3</title>
    <f:max_value_a>1 999 999</f:max_value_a>
    <f:min_value_a>100 000</f:min_value_a>
    <f:min_value_b>2 000 000</f:min_value_b>
    <f:value_for_a>3,735</f:value_for_a>
    <f:value_for_b>3,445</f:value_for_b>
</entry>    

f: value_for_d是最高值,f:value_for_c低于d,依此类推

我有一个动态目标值(在这个例子中,我们只使用2000 000)

我想得到max_value大于targetvalue的值,但有时max_values没有定义,然后设置为";0〃"0";在max_ value中应该意味着不受限制的";屋顶";。min_value不能大于targetvalue,但有时不定义min_value,然后设置为";0〃"0";min_ value应该意味着不受限制的"最小值";地板";。

我试过使用这个代码

if ($value_for_d > 0 ){
    if (($min_value_d <= $targetvalue) xor ($min_value_d == 0)){
        if (($max_value_d >= $targetvalue) xor ($max_value_d == 0)){
            $query_result = TRUE;
            $value = $value_for_d;
        }
    }
}elseif ($value_for_c > 0 ){
    if (($min_value_c <= $targetvalue) xor ($min_value_c == 0)){
        if (($max_value_c >= $targetvalue) xor ($max_value_c == 0)){
            $query_result = TRUE;
            $value = $value_for_c;
        }
    }
}elseif ($value_for_b > 0 ){
    if (($min_value_b <= $targetvalue) xor ($min_value_b == 0)){
        if (($max_value_b >= $targetvalue) xor ($max_value_b == 0)){
            $query_result = TRUE;
            $value = $value_for_b;
        }
    }
}elseif ($value_for_a > 0 ){
    if (($min_value_a <= $targetvalue) xor ($min_value_a == 0)){
        if (($max_value_a >= $targetvalue) xor ($max_value_a == 0)){
            $query_result = TRUE;
            $value = $value_for_a;
        }
    }
}

如果我以目标值"0"运行此代码;2000";,我得到这个结果:

Entry 1 - 3.9 (correct value is 3.9)
Entry 2 - 0 (correct value is 4.2)
Entry 3 - 3.445 (correct value is 3.445)

如果我将目标值设置得更低,即500000,那么我的所有条目都将为0。

编辑4:

如果我这样做:

var_dump($min_value_d,$max_value_d,$min_value_c,$max_value_c,$min_value_b,$max_‌​value_b,$min_value_a,$max_value_a);

我得到以下输出:https://dpaste.de/DtjhO/

如果区域总是排他的并且总是按正确的顺序排列,我建议您这样做:

<?php
if($min_value_d <= $targetvalue) {
    $value = $value_for_d;
} else if($min_value_c <= $targetvalue) {
    $value = $value_for_c;
} else if($min_value_b <= $targetvalue) {
    $value = $value_for_b;
} else if($min_value_b <= $targetvalue) {
    $value = $value_for_b;
}
?>

但是,如果它们并不总是独占的,则应该返回某种形式的数组,因为它可能满足多个条件:假设$min_value_x不在XML中时未设置(As in,无最小值),$max_value_xs不在XML(As in、无最大值)中时不设置

<?php
$values = array();
//if (there is no minimum or its smaller than target)                                         and (there is no maximum or its larger than target)                                           and at least one of them is non-null
if((is_null($min_value_d) || preg_replace('/([^0-9.])/i', '',$min_value_d) <= $targetvalue) && (is_null($max_value_d) || preg_replace('/([^0-9.])/i', '',$max_value_d) >= $targetvalue) && !(is_null($min_value_d) && is_null($max_value_d))) $values[] = $value_for_d;
if((is_null($min_value_c) || preg_replace('/([^0-9.])/i', '',$min_value_c) <= $targetvalue) && (is_null($max_value_c) || preg_replace('/([^0-9.])/i', '',$max_value_c) >= $targetvalue) && !(is_null($min_value_c) && is_null($max_value_c))) $values[] = $value_for_c;
if((is_null($min_value_b) || preg_replace('/([^0-9.])/i', '',$min_value_b) <= $targetvalue) && (is_null($max_value_b) || preg_replace('/([^0-9.])/i', '',$max_value_b) >= $targetvalue) && !(is_null($min_value_b) && is_null($max_value_b))) $values[] = $value_for_b;
if((is_null($min_value_a) || preg_replace('/([^0-9.])/i', '',$min_value_a) <= $targetvalue) && (is_null($max_value_a) || preg_replace('/([^0-9.])/i', '',$max_value_a) >= $targetvalue) && !(is_null($min_value_a) && is_null($max_value_a))) $values[] = $value_for_a; 
?>

事实证明,您的项目是用空格格式化的,因此当转换为浮点值进行解释时,它只查看第一组数字。preg_replace('/([^0-9.])/i', '', $var)删除任何非数字内容。(记住,这在计算上相当昂贵)