2015-05-04 4 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>"; 

, но я не думаю, что это хорошее решение, потому что я должен создать, если еще для каждого условия.

Есть ли лучший способ сделать это? если да, то, пожалуйста, предложите это мне.

Update:

Главный вопрос:

Цвета будут вести себя так, если это 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; 
     } 
    } 

?> 

EDIT:

Как с вашего обновленного кода, это должно работать для вас:

<?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; 
     } 
    } 

?> 

EDIT 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

Смежные вопросы