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)

targetvalue をさらに低い 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;
}
?>

ただし、それらが常に排他的であるとは限らない場合は、複数の基準を満たす可能性があるため、何らかの形式の配列を返す必要があります。 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; 

?>

結局のところ、項目はスペースでフォーマットされているため、解釈のために float に変換すると、最初の数値セットのみが表示されます。preg_replace('/([^0-9.])/i', '', $var)非数値をすべて削除します。(これはかなり計算コストがかかります)

于 2013-07-01T14:22:31.880 に答える