PHP 改变字体颜色的 if 语句的多个条件

PHP multiple conditions for if statement that changes font color

我对这个 PHP 代码有一些问题:

 // HIGHLIGHT NUMBERS *************************************************
 // BUY
$valueEnlightOverBuy = $_POST["enlightOverBuy"];
$valueEnlightUnderBuy = $_POST["enlightUnderBuy"];

// GREEN PRICE BUY
$fontColorBuy = "#FFF"; 

    if ((($valueEnlightOverBuy != '') or ($valueEnlightUnderBuy != '')) and (($valueEnlightOverBuy and $valueEnlightUnderSell) != "0")) {
    if (($finalPriceBuyer >= $valueEnlightOverBuy) or ($finalPriceBuyer <= $valueEnlightUnderBuy)) {
    $fontColorBuy = "#00FF00";
    } else if (($finalPriceBuyer >= $valueEnlightOverBuy and $finalPriceBuyer <= $valueEnlightUnderBuy)) {
    $fontColorBuy = "#FF00FF";
    } else {
    $fontColorBuy = "#D00000";
    }};

 // SELL LOCAL
 $valueEnlightOverSloc = $_POST["enlightOverSloc"];
 $valueEnlightUnderSloc = $_POST["enlightUnderSloc"];

 // GREEN PRICE SELL LOCAL
 $fontColorSellLoc = "#FFF";    

    if ((($valueEnlightOverSloc != '') or ($valueEnlightUnderSloc != '')) & (($valueEnlightOverSloc & $valueEnlightUnderSloc) != "0")) {
    if (($finalPriceSellerLocal >= $valueEnlightOverSloc) or ($finalPriceSellerLocal <= $valueEnlightUnderSloc)) {
    $fontColorSellLoc = "#00FF00";
    } else if (($finalPriceSellerLocal >= $valueEnlightOverSloc) and ($finalPriceSellerLocal <= $valueEnlightUnderSloc)) {
    $fontColorSellLoc = "#FF00FF";
    } else {
    $fontColorSellLoc = "#D00000";
    }};

 // SELL INTERNATIONAL
 $valueEnlightOverSellInt = $_POST["enlightOverSellInt"];
 $valueEnlightUnderSellInt = $_POST["enlightUnderSellInt"];

 // GREEN PRICE SELL INTERNATIONAL
 $fontColorSellInt = "#FFF";    

    if ((($valueEnlightOverSellInt != '') or ($valueEnlightUnderSellInt  != '')) & (($valueEnlightOverSellInt & $valueEnlightUnderSellInt) != "0"))      {
    if (($finalPriceSellerInt >= $valueEnlightOverSellInt) or  ($finalPriceSellerInt <= $valueEnlightUnderSellInt)) {
    $fontColorSellInt = "#00FF00";
    } else if (($finalPriceSellerInt >= $valueEnlightOverSellInt) and  ($finalPriceSellerInt <= $valueEnlightUnderSellInt)) {
    $fontColorSellInt = "#FF00FF";
    } else {
    $fontColorSellInt = "#D00000";  
    }};

如您所见,我有一个 post 表单(未在代码中显示)将以下值传输到此文件:VAR underBuy < BUY PRICE < VAR overBuy; VAR underLocalSeller < LOCAL SELL PRICE < VAR overLocalSeller; VAR underIntSeller < INT SELL PRICE < VAR underIntSeller.

首先代码进行检查 如果从表单收到的 VAR 为 EMPTY 或 = 为 0;如果不是, 该代码收集所有这些数据并检查前两个 VAR 的 $FINALPRICEBUYER(从具有 json 的文件中提取),然后检查 $FINALPRICESELLERLOCAL 的第三个和第四个 VAR,然后进行检查第 5 个和第 6 个 VAR 在 $FINALPRICESELLERINT 上。

如果 $FINALPRICEBUYER 介于 >= 第一个 VAR 或 <= 比第 2 个 VAR 使字体变为绿色,否则如果 $FINALPRICEBUYER 在第 3 个 VAR 和第 4 个 VAR 之间变为 VIOLET, 否则去红色。

$FINALPRICESELLERLOCAL 和 $FINALPRICESELLERINT 相同。

我做了前两个条件,因为用户可以插入一个或两个价格限制。

你能帮我理解我做错了什么吗? (也许这只是逻辑问题)。

这里是问题:

此代码无效。很多时候它 return 绿色字体尽管是紫色,所以数学符号的逻辑结构中应该有一些东西(当然是 PHP 代码)我无法理解...

2015 年 6 月 29 日更新

这是我正在使用和改编的代码,从您的示例开始。

// ENLIGHT NUMBERS ***************************************************

// get all input variables at once
$over_buy  = $_POST['enlightOverBuy'];
$under_buy = $_POST['enlightUnderBuy'];
$over_loc  = $_POST['enlightOverSloc'];
$under_loc = $_POST['enlightUnderSloc'];
$over_int  = $_POST['enlightOverSellInt'];
$under_int = $_POST['enlightUnderSellInt'];

$final_buy = $finalPriceBuyer;
$final_loc = $finalPriceSellerLocal;
$final_int = $finalPriceSellerInt;

// now set the colors
$buy = getFontColor( $over_buy, $under_buy, $final_buy );
$loc = getFontColor( $over_loc, $under_loc, $final_loc );
$int = getFontColor( $over_int, $under_int, $final_int );

所以这里没有什么不同。 现在函数:

 // function to return color based on input
 function getFontColor( $over, $under, $final ) {

 // colors
 $white  = '#fff';
 $green  = '#0f0';
 $violet = '#f0f';
 $red    = '#d00000';

第一步:如果函数得到“0”数字字体将是白色的所以:

 if ($final != '0') {

第二步:如果"value"都是由表单发送的

     if (!empty($over) and !empty($under)) {

第三步:如果 FINAL 是介于 over 和 under 之间的数字

           if ($final >= $over && $final <= $under) {

走向绿色

                  return $green;

如果没有

           } else {

变红

           return $red; 
           }

第四步:否则如果 "value" 之一或另一个为空

 } else if (!empty($over) or !empty($under)) {

第五步:如果FINAL是一个大于"over"值,或小于"under"值的数

        if ($final >= $over or $final <= $under) {

走向绿色

                return $green;

否则变红

        } else {
                return $red;
                }

第六步:在任何其他情况下,转白色

 } else {
        return $white;
 }
 }};

所以如果 $final 介于从表单收到的两个值之间,我会得到绿色,但是如果你只有一个值输入(所以低于或高于),如果 $final 高于高于或低于低于,则继续绿色。 在任何其他情况下,如果 $final 不是“0”,则转为红色。

这里是没有空格的完整代码:

// ENLIGHT NUMBERS ***************************************************

// get all input variables at once
$over_buy  = $_POST['enlightOverBuy'];
$under_buy = $_POST['enlightUnderBuy'];
$over_loc  = $_POST['enlightOverSloc'];
$under_loc = $_POST['enlightUnderSloc'];
$over_int  = $_POST['enlightOverSellInt'];
$under_int = $_POST['enlightUnderSellInt'];

$final_buy = $finalPriceBuyer;
$final_loc = $finalPriceSellerLocal;
$final_int = $finalPriceSellerInt;

// now set the colors
$buy = getFontColor( $over_buy, $under_buy, $final_buy );
$loc = getFontColor( $over_loc, $under_loc, $final_loc );
$int = getFontColor( $over_int, $under_int, $final_int );

 // function to return color based on input
 function getFontColor( $over, $under, $final ) {

 // colors
 $white  = '#fff';
 $green  = '#0f0';
 $violet = '#f0f';
 $red    = '#d00000';

 if ($final != '0') {
     if (!empty($over) and !empty($under)) {
           if ($final >= $over && $final <= $under) {
                  return $green;
           } else {
           return $red; 
           }
 } else if (!empty($over) or !empty($under)) {
        if ($final >= $over or $final <= $under) {
                return $green;
        } else {
                return $red;
                }
 } else {
        return $white;
 }
 }};

这对我来说似乎是正确的,但我收到了一个奇怪的结果,您将看到的回声是我创建的,用于检查功能行为。

请不要考虑我的意大利评论,但结果是无意义的,考虑在:

怎么可能使用相同的函数,您在第一次使用时总是出错,而在接下来的 2 次使用中总是得到正确答案?

最终更新

代码如下:

 $over_buy  = number_format($_POST['enlightOverBuy'], 6);
 $under_buy = number_format($_POST['enlightUnderBuy'], 6);
 $over_loc  = number_format($_POST['enlightOverSloc'], 6);
 $under_loc = number_format($_POST['enlightUnderSloc'], 6);
 $over_int  = number_format($_POST['enlightOverSellInt'], 6);
 $under_int = number_format($_POST['enlightUnderSellInt'], 6);


 $final_buy = $finalPriceBuyer;
 $final_loc = $finalPriceSellerLocal;
 $final_int = $finalPriceSellerInt;

 // now set the colors
 $buy = getFontColor( $over_buy, $under_buy, $final_buy );
 $loc = getFontColor( $over_loc, $under_loc, $final_loc );
 $int = getFontColor( $over_int, $under_int, $final_int );


 // function to return color based on input
 function getFontColor( $over, $under, $final ) {

 // colors
 $white  = '#fff';
 $green  = '#0f0';
 $red    = '#FF3300';

 if ($final != '0') {
    if (!empty($over) and !empty($under)) {
        if ($final >= $over && $final <= $under) {
                return $green;
        } else {
                return $red; 
                }
 } elseif (!empty($over)) {
                return ($final >= $over) ? $green : $red;
 } elseif (!empty($under)) {
                return ($final <= $under) ? $green : $red;
 } else {
    return $white;
    }
 }};

您必须首先检查最严格的条件。请参阅此代码:

// case A
if($z>$x && $z<$y) {}
// case B
if($z>$x || $z<$y) {}

结果:

$x | $y | $z | case A | case B
10   20    5    false     true
10   20   15     true     true
10   20   25    false     true

每当 case A 的计算结果为 true 时,case B 也计算为 true。但反过来的情况可能不会。因此,如果您将 case B 放在 IF ELSE 的第一位,它将始终 return true 在到达 案例 A.
之前 固定代码示例:

$valueEnlightOverBuy  = $_POST["enlightOverBuy"];
$valueEnlightUnderBuy = $_POST["enlightUnderBuy"];

// GREEN PRICE BUY
$fontColorBuy = "#FFF";

// user has provided price boundaries
if($valueEnlightOverBuy !== '' && $valueEnlightUnderSell !== '') {

   // satisfies both boundaries (violet, should be green ?)
   if($finalPriceBuyer >= $valueEnlightOverBuy && $finalPriceBuyer <= $valueEnlightUnderBuy) {
      $fontColorBuy = "#FF00FF";
   }
   // satisfies at least one boundary (green, should be violet ?)
   elseif($finalPriceBuyer >= $valueEnlightOverBuy || $finalPriceBuyer <= $valueEnlightUnderBuy) {
      $fontColorBuy = "#00FF00";
   }
   // outside the boundaries (wrong boundaries order) (red)
   else {
      $fontColorBuy = "#D00000";
   }
}

凭直觉,我觉得您实际上希望 AND 条件为绿色,而 OR 条件为紫色,但是我可能错了。我必须指出,红色条件只有在边界设置顺序错误时才会触发,尽管这看起来很合适。

关于 2015-06-29 更新:

在此代码中:

elseif(!empty($over) or !empty($under)) {
   if ($final >= $over or $final <= $under) {
      return $green;
   } 
   else {
      return $red; 
   }
}

在您的示例中,您得到 $green 因为 $over 被评估为 zero ,因此任何正值都会 return 绿色。您必须只计算非空值。

elseif(!empty($over)) {
   return ($final >= $over) ? $green : $red;
}
elseif(!empty($under)) {
   return ($final <= $under) ? $green : $red;
}

这里有很多事情要解决...

看来你可以好好阅读一下:

.

if (($finalPriceBuyer >= $valueEnlightOverBuy) or ($finalPriceBuyer <= $valueEnlightUnderBuy)) {
    $fontColorBuy = "#00FF00";
} else if (($finalPriceBuyer >= $valueEnlightOverBuy and $finalPriceBuyer <= $valueEnlightUnderBuy)) { ... }

更重要的是,要懒惰 DRY。如果你做同样的事情两次,把它放到一个函数中:

function getColor($value, $limitOver, $limitUnder, $colors){
    $underCheck = !is_numeric($limitUnder) || $value >= $limitUnder;
    $overCheck = !is_numeric($limitOver) || $value <= $limitOver;
    if ($underCheck && $overCheck) {
        // all valid bounds are satisfied
        return $colors['none'];
    } else if ($overCheck){
        // valid lower bound exists and is not satisfied 
        // and upper bound does not exist or is not valid or is satisfied
        return $colors['under'];
    } else if ($underCheck){
        // valid upper bound exists and is not satisfied 
        // and lower bound does not exist or is not valid or is satisfied
        return $colors['over'];
    } else {
        // both bounds exist and none of them are satisfied
        return $colors['both'];
    }
}

$colors = array (
    'both' => "#FF00FF",
    'over' => "#D00000",
    'under' => "#FFF",
    'none' => "#00FF00",
);

$colorBuy = getColor(
    $finalPriceBuyer,
    $_POST["enlightOverBuy"],
    $_POST["enlightUnderBuy"],
    $colors 
);

$colorLocal = getColor(
    $finalPriceSellerLocal,
    $_POST["enlightOverSloc"],
    $_POST["enlightUnderSloc"],
    $colors 
);

$colorInt = getColor(
    $finalPriceSellerInt,
    $_POST["enlightOverSellInt"];,
    $_POST["enlightUnderSellInt"],
    $colors 
);

您对问题的定义还不是很清楚,因此您需要检查我是否正确解释了您的意图并进行了必要的修改以满足您的确切需求,但您明白了。

注意:这个问题应该移至 the code review site

我认为你的主要问题是编码风格和组织。您的代码难以阅读,因此更难调试。特别是当您尝试实现复杂的逻辑时,确保您拥有干净的代码会很有帮助。这里有一些建议。

  1. 使用较短的变量名
  2. 用户正确的缩进
  3. 使用内置的 PHP 函数来简化,例如empty()
  4. 使用函数消除重复
  5. 将相似的任务集中在一个地方,例如获取 $_POST 个变量的值

首先,我将按照以下建议重写您的代码:

// function to return color based on input
function getFontColor( $over, $under, $final ) {
    // colors
    $white  = '#fff';
    $green  = '#0f0';
    $violet = '#f0f';
    $red    = '#d00000';

    if ( !empty($over) and !empty($under) ) {
        if ( $final >= $over || $final <= $under ) return $green;
        if ( $final >= $over && $final <= $under ) return $violet;
        return $red;
    } else {
        return $white;
    }
}

// get all input variables at once
$over_buy  = $_POST['enlightOverBuy'];
$under_buy = $_POST['enlightUnderBuy'];
$over_loc  = $_POST['enlightOverSloc'];
$under_loc = $_POST['enlightUnderSloc'];
$over_int  = $_POST['enlightOverSellInt'];
$under_int = $_POST['enlightUnderSellInt'];

// now set the colors
$buy = getFontColor( $over_buy, $under_buy, $final_buy );
$loc = getFontColor( $over_loc, $under_loc, $final_loc );
$int = getFontColor( $over_int, $under_int, $final_int );

一旦完成,我们至少可以看到一个问题。上面的 getFontColor() 函数永远不会 return $violet 因为你在 AND 语句之前有 OR 语句。要更正该问题,该函数应重写为:

// function to return color based on input
function getFontColor( $over, $under, $final ) {
    // colors
    $white  = '#fff';
    $green  = '#0f0';
    $violet = '#f0f';
    $red    = '#d00000';

    if ( !empty($over) and !empty($under) ) {
        if ( $final >= $over && $final <= $under ) return $violet;
        if ( $final >= $over || $final <= $under ) return $green;
        return $red;
    } else {
        return $white;
    }
}

但是,即使进行了这次修订,我仍然不确定代码是否按照您的预期执行。无论如何,它应该更容易调试,因为它更简单、更干净。希望这对您有所帮助!