2015-05-04 41 views
2

創建該顏色的功能我創建一個功能來創建這樣Image link 像我的意思是我想顯示的顏色像我怎麼能按遞減順序

  1. 0%-1%的綠色到淺綠色
  2. 1%-3%的黃色至淺黃色
  3. 3%-5%橙色至淺橙色
  4. 5% - 6紅色至暗紅色

目前,我認爲只有在if else條件下才有可能。

我以下列方式這樣做:

function getBackground($val) { 
    if($val<=0.3) 
     return "#0A3A0A"; 
    if($val< 0.5) 
     return "#1E4E1E"; 
    if($val< 1) 
     return "#508050"; 

    if($val< 1.4) 
     return "#FFFF0A"; 
    if($val< 1.8) 
     return "#FFFF1E"; 
    if($val< 2) 
     return "#FFFF32"; 
    if($val< 2.4) 
     return "#FFFF46";  
    return "red"; 
} 

,並以這種方式HTML。它是在循環1-15

$class=getBackground($val); 
echo "<li style='background:{$class}'>{$val}%</li>"; 

,但我不認爲這是一個很好的解決方案,因爲我的if else創造一切條件。

有沒有更好的方法來做到這一點?如果是的話,請給我建議。

更新:

主要問題是:

的顏色將這樣的表現如果是0.2%的顏色會明亮的綠色,如果它是O.6%,將淺綠色等上。如果它是0.9%,它會變綠。

我正在尋找一個解決方案,以顯示不同的顏色,如果值是0.1然後深綠色,如果它是0.1更暗綠色................. 0.9打火機綠色 。類似地,如果val是1.1,則暗黃色。如果它是1.2較暗的黃色........ 1.9較淡的黃色。像這樣的東西

回答

4

這應該適合你:

只需將你的顏色放入一定範圍的數組。然後遍歷所有顏色,如果$val在範圍內,則將顏色指定爲$class並打破循環。

<?php 

    $arr = [ 
      "green" => ["start" => 0, "end" => 1], 
      "yellow" => ["start" => 1, "end" => 3], 
      "orange" => ["start" => 3, "end" => 5], 
      "red" => ["start" => 5, "end" => 6], 
     ]; 

    $class = "default"; 
    foreach($arr as $color => $range) { 
     if($val <= $range["end"] && $val >= $range["start"]) { 
      $class = $color; 
      break; 
     } 
    } 

?> 

編輯:

從您更新的代碼,這應該爲你工作:

<?php 

    $arr = [ 
      ["start" => 0, "end" => 0.3, "color" => "#0A3A0A"], 
      ["start" => 0.3, "end" => 0.5, "color" => "#1E4E1E"], 
      ["start" => 0.5, "end" => 1, "color" => "#508050"], 
      ["start" => 1, "end" => 1.4, "color" => "#FFFF0A"], 
      ["start" => 1.4, "end" => 1.8, "color" => "#FFFF1E"], 
      ["start" => 1.8, "end" => 2, "color" => "#FFFF32"], 
      ["start" => 2, "end" => 2.4, "color" => "#FFFF46"], 
     ]; 

    $class = "red"; 
    foreach($arr as $range) { 
     if($val <= $range["end"] && $val >= $range["start"]) { 
      $class = $range["color"]; 
      break; 
     } 
    } 

?> 

編輯2:

既然你不想「靜態「值,這應該適合你:

<?php 

    $arr = [ 
      ["start" => 0, "end" => 0.8, "colorStart" => "FFE6E6", "colorEnd" => "4C0000", "interval" => ""], 
      ["start" => 0.8, "end" => 1.8, "colorStart" => "C2FFC2", "colorEnd" => "296629", "interval" => ""], 
      ["start" => 1.8, "end" => 2.7, "colorStart" => "C2C2FF", "colorEnd" => "6666FF", "interval" => ""], 
     ]; 


    $arr = array_map(function($v){ 
     $steps = intval((($v["end"] - $v["start"]) * 10)); 
     list($redStart, $greenStart, $blueStart) = array_map("hexdec", str_split($v["colorStart"], 2)); 
     list($redEnd, $greenEnd, $blueEnd) = array_map("hexdec", str_split($v["colorEnd"], 2)); 

     $interval = sprintf("%02d", intval(($redStart - $redEnd)/$steps)) . sprintf("%02d", intval(($greenStart - $greenEnd)/$steps)) . sprintf("%02d", intval(($blueStart - $blueEnd)/$steps)); 
     return array_merge($v, ["interval" => $interval]); 
    }, $arr); 


    $val = 1.1; 
    $class = "FF0000"; 
    foreach($arr as $range) { 
     if($val < $range["end"] && $val >= $range["start"]) { 
      $class = ""; 
      $multiplier = intval((($val - $range["start"]) * 10)); 
      list($redAdd, $greenAdd, $blueAdd) = array_map(function($v)use($multiplier){return dechex($v*$multiplier);}, str_split($range["interval"], 2)); 
      list($redStart, $greenStart, $blueStart) = str_split($range["colorStart"], 2); 
      list($redEnd, $greenEnd, $blueEnd) = str_split($range["colorEnd"], 2); 

      $colors = ["red", "green", "blue"]; 

       foreach($colors as $color) { 
        if(hexdec(${$color . "End"}) > hexdec(${$color . "Start"})) 
         $r = hexdec(${$color . "Start"}) + hexdec(${$color. "Add"}); 
        else 
         $r = hexdec(${$color . "Start"}) - hexdec(${$color. "Add"}); 
        $class .= sprintf("%02X", ($r >= 0 && $r <= 255 ? $r : ($r<0?0:255))); 
       } 

      break; 
     } 
    } 

    echo "<div style='hight:100px;width:200px;background-color:#$class;'>some text</div>"; 

?> 

Demo