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

Ausgedruckt am: 07.05.2024 um 19:05 Uhr

Mitglied: SlainteMhath
Lösung SlainteMhath 06.08.2014 aktualisiert um 13:23:33 Uhr
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
Mitglied: colinardo
Lösung colinardo 06.08.2014 aktualisiert um 15:28:15 Uhr
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
Mitglied: Midivirus
Midivirus 06.08.2014 aktualisiert um 12:06:07 Uhr
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;');  
}
Mitglied: colinardo
colinardo 06.08.2014 um 13:15:25 Uhr
Goto Top
Wenns das dann war, den Beitrag bitte noch auf gelöst setzen. Merci.
Mitglied: Midivirus
Midivirus 06.08.2014 aktualisiert um 13:24:33 Uhr
Goto Top
... ich vergess das immer wieder :'(