0

编辑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,以此类推。

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

我想得到 max_value 大于 targetvalue 的值,但有时 max_value 没有定义,然后设置为“0”。max_value 中的“0”应该意味着无限的“屋顶”。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;
        }
    }
}

如果我以“2 000 000”的目标值运行此代码,我会得到以下结果:

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)

如果我将目标值设置为更低,即 500 000,我的所有条目都会得到 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/

4

1 回答 1

1

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

<?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 中时未设置(如,没有最小值)并且 $max_value_x 是不在 XML 中时未设置(如中,无最大值)

<?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)删除任何非数字的东西。(请注意,这在计算上非常昂贵)

于 2013-07-01T14:22:31.880 回答