midivirus
Goto Top

PHP RGB dynamische Hintergrundfarbe errechnen

Guten Morgen Gemeinde,

ich gebe euch mal meinen bisherigen Code vorweg:

function rgb($intPct, $intPctM){
	// round(max(0,255-(($intPct-0)*16.1)))
	$array = array(
	0=>array(0,255,0), 		//grün
	1=>array(15,255,0),
	2=>array(30,255,0),
	3=>array(45,255,0),
// schnipp
	13=>array(195,255,0),
	14=>array(210,255,0),
	15=>array(225,255,0),	//gelb
	16=>array(240,255,0),
	17=>array(255,255,0),
	18=>array(255,240,0),
	19=>array(255,225,0),
	20=>array(255,210,0),
	21=>array(255,195,0),
// schnipp
	31=>array(255,45,0),
	32=>array(255,30,0),
	33=>array(255,15,0),
	34=>array(255,0,0),		// rot
	35=>array(255,0,25),
	36=>array(255,0,50),
	37=>array(255,0,75),
	38=>array(255,0,100),
	39=>array(255,0,125),
	40=>array(255,0,150),
	);
		
	return(' style="background-color:rgb('.$array[$intPct].','.$array[$intPct][1].','.$array[$intPct][2].')" ');  
}

Nachdem ich auf einer anderen Webseite ein Codeschnipsel mit in dieser Art gefunden hatte round(max(0,255-(($intPct-0)*16.1))) ist das okay, aber die Abstände sind ja dynamisch.
Meine Tabelle oben ist nur für den Übergang ... !

Die obige Funktion erzeugt dann eine schöne Farbskala:
a7d44500cad50bbbc1def80ca317c34f


Mein Ziel ist es aber, aus einer Reihe von 5 Werten, wird der höchste mit 40 belegt und entsprechend prozentual die anderen angefärbt:
bdd7ed115311b9523f9deaddd676dcce
Die Funktion bekommt den aktuellen Wert für die Hintergrundfarbe und den Maximalwert als Orientierung.

Excel kann das wunderbar, bislang fehlte mir aber noch eine nachvollziehbare Funktion hierfür.


Tipps zur Lösungsfindung wäre verdammt cool.

Content-Key: 245703

Url: https://administrator.de/contentid/245703

Printed on: April 19, 2024 at 01:04 o'clock

Member: SlainteMhath
Solution SlainteMhath Aug 06, 2014 updated at 11:23:33 (UTC)
Goto Top
Moin,

das sollte sich mit einem Dreisatz lösen lassen
Pseudo Code
ArrayElement=(MaximalWert/100) * (länge(array)/100)

Ohne Gewähr - hatte erst einen Kaffee heute face-smile

lg,
Slainte
Member: colinardo
Solution colinardo Aug 06, 2014 updated at 13:28:15 (UTC)
Goto Top
Moin,
wie @SlainteMhath schon schreibt ist das mit einer einfachen Prozentrechnung erledigt. Hier ein Beispiel:
<?php
function getColor($current,$max){
	$intPct = round(($current / $max) * 100);
	$r=($intPct<50) ? round(min(255,$intPct*5.1 ))          :255;
	$g=($intPct>50) ? round(max(0,255-(($intPct-50)*5.1)))  :255;
	return $r.','.$g.',0';  
}
function printArray(){
	$arr = array(5,65,44,33,20,50,80);
	$max = max($arr);
	for($i = 0; $i < count($arr); $i++){
		$out .= '<td style="text-align:center;width:50px;background-color:rgb('.getColor($arr[$i],$max).')">'. $arr[$i].'</td>';  
	}
	return $out;
}
?>
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">  
<title> Color</title>
</head>
<body>
<table>
<tr><?php echo printArray(); ?></tr>
</table>
</body>
</html>
Viel Erfolg
Grüße Uwe
Member: Midivirus
Midivirus Aug 06, 2014 updated at 10:06:07 (UTC)
Goto Top
Ich hab es so gelöst:

function rgb($intPct, $intPctM){
	$array = array(
	0=>array(0,255,0), 		//grün
	1=>array(15,255,0),
	2=>array(30,255,0),
//schnipp
	13=>array(195,255,0),
	14=>array(210,255,0),
	15=>array(225,255,0),	//gelb
	16=>array(240,255,0),
	17=>array(255,255,0),
	18=>array(255,240,0),
//schnipp
	32=>array(255,30,0),
	33=>array(255,15,0),
	34=>array(255,0,0),		// rot
//schnipp
	);

	$intPct = round((count($array)-1)*($intPct/($intPctM/100))/100);

	return('background-color:rgb('.$array[$intPct].','.$array[$intPct][1].','.$array[$intPct][2].'); color:black;');  
}
Member: colinardo
colinardo Aug 06, 2014 at 11:15:25 (UTC)
Goto Top
Wenns das dann war, den Beitrag bitte noch auf gelöst setzen. Merci.
Member: Midivirus
Midivirus Aug 06, 2014 updated at 11:24:33 (UTC)
Goto Top
... ich vergess das immer wieder :'(