基本上,您正在寻找一种将一个范围任意映射到另一个范围的方法(7-365 应该映射为FFFFFF - D9D8D9)。
第一件事:将十进制转换为十六进制非常简单:
$age = mt_rand(1,600);
if ($age > 365) $hex = 'D9D8D9';
elseif ($age < 7) $hex = 'FFFFFF';
else $hex = str_pad(dechex($age), 6, '0', STR_PAD_LEFT);
我所做的只是检查$age是否大于365,如果是,我分配D9D8D9常量,如果小于7,我分配FFFFFF。在所有其他情况下,我只是将数字转换为十六进制,然后使用 0 将生成的字符串填充为 6 个字符,因此 255 将变为 FF,并填充为 0000FF。
但是要在一个范围上映射一个范围,我们必须找出最小范围内的 1 步长如何扩展到更大的范围内。这是一个简单的“三规则”:计算两个比例中的 1 的等价物,然后相乘。然后应用相同的范围界限,就可以了。
您使用的颜色范围是FFFFFF 到D9D8D9,或者用小数表示:16777215 到14276809。这给我们留下了2500406 的范围,而不是 365-7(或 358)天。因此,每一天都“值得” 6984.374301676 ((D9D8D9-FFFFFF)/(365-7)) 在我们的颜色范围内。
把它们放在一起,你有2个选择:计算到FFFFFF或D9D8D9的距离,但就结果而言,你选择哪一个并不重要。
<CrLowBound> - (<value>-<VLowBound>)*<CrStep>
//or
<CrHighBound> - (<VHighBound> - <value>)*<CrStep>
两者都简单地计算与给定值对应的颜色范围内的值。 CrLowBound 和 CrHighBound 分别是 FFF 和 D9D8D9,方式大致相同:VLowBound 和 VHighBound 是 6 和 366。CrStep 是 6984.374301676。我已经解释了我是如何得到这些值的。
$age = mt_rand(1,600);
if ($age > 365) $hex = 'D9D8D9';
elseif ($age < 7) $hex = 'FFFFFF';
else $hex = str_pad(dechex(14276809-(round((366-$dec)*6984.374301676))), 6, '0', STR_PAD_LEFT);
//Or:
$hex = str_pad(dechex(16777215-(round(($dec-6)*6984.374301676))), 6, '0', STR_PAD_LEFT);
这将使D9D8D9 到FFFFFF 范围内的颜色范围分布更均匀:项目越旧,颜色越接近D9D8D9,越近,越接近@987654351 @.
例如,如果年龄是117,则“颜色”将是1A6E1D:
//age (max-age)*worth hex
117 == 1732125 == 1a6e1d
用以下代码测试:
function getColour($dec)
{
if ($dec > 365) return 'D9D8D9';
if ($dec < 7) return 'FFFFFF';
return strtoupper(
str_pad(
dechex(14276809-(round((366-$dec)*6984.374301676))),
6,
'0',
STR_PAD_LEFT
)
);
}
$days = range(6,366);
$colours = array();
foreach($days as $day) $colours[$day] = getColour($day);
$out = array_chunk($colours, 8);
foreach($out as $k => $chunk) $out[$k] = implode(' - ', $chunk);
echo implode('<br>', $out);
并将其作为输出:
FFFFFF - B3964B - B3B193 - B3CCDB - B3E824 - B4036C - B41EB4 - B439FD
B45545 - B4708E - B48BD6 - B4A71E - B4C267 - B4DDAF - B4F8F7 - B51440
B52F88 - B54AD1 - B56619 - B58161 - B59CAA - B5B7F2 - B5D33A - B5EE83
B609CB - B62514 - B6405C - B65BA4 - B676ED - B69235 - B6AD7D - B6C8C6
B6E40E - B6FF57 - B71A9F - B735E7 - B75130 - B76C78 - B787C0 - B7A309
B7BE51 - B7D99A - B7F4E2 - B8102A - B82B73 - B846BB - B86203 - B87D4C
B89894 - B8B3DD - B8CF25 - B8EA6D - B905B6 - B920FE - B93C46 - B9578F
B972D7 - B98E20 - B9A968 - B9C4B0 - B9DFF9 - B9FB41 - BA1689 - BA31D2
BA4D1A - BA6863 - BA83AB - BA9EF3 - BABA3C - BAD584 - BAF0CC - BB0C15
BB275D - BB42A6 - BB5DEE - BB7936 - BB947F - BBAFC7 - BBCB0F - BBE658
BC01A0 - BC1CE9 - BC3831 - BC5379 - BC6EC2 - BC8A0A - BCA552 - BCC09B
BCDBE3-BCF72C-BD1274-BD2DBC-BD4905-BD644D-BD7F95-BD9ADE
BDB626 - BDD16F - BDECB7 - BE07FF - BE2348 - BE3E90 - BE59D8 - BE7521
BE9069 - BEABB2 - BEC6FA - BEE242 - BEFD8B - BF18D3 - BF341B - BF4F64
BF6AAC - BF85F5 - BFA13D - BFBC85 - BFD7CE - BFF316 - C00E5E - C029A7
C044EF-C06038-C07B80-C096C8-C0B211-C0CD59-C0E8A1-C103EA
C11F32 - C13A7B - C155C3 - C1710B - C18C54 - C1A79C - C1C2E4 - C1DE2D
C1F975-C214BE-C23006-C24B4E-C26697-C281DF-C29D27-C2B870
C2D3B8 - C2EF01 - C30A49 - C32591 - C340DA - C35C22 - C3776A - C392B3
C3ADFB-C3C944-C3E48C-C3FFD4-C41B1D-C43665-C451AD-C46CF6
C4883E - C4A387 - C4BECF - C4DA17 - C4F560 - C510A8 - C52BF0 - C54739
C56281-C57DCA-C59912-C5B45A-C5CFA3-C5EAEB-C60633-C6217C
C63CC4 - C6580D - C67355 - C68E9D - C6A9E6 - C6C52E - C6E076 - C6FBBF
C71707 - C7324F - C74D98 - C768E0 - C78429 - C79F71 - C7BAB9 - C7D602
C7F14A-C80C92-C827DB-C84323-C85E6C-C879B4-C894FC-C8B045
C8CB8D - C8E6D5 - C9021E - C91D66 - C938AF - C953F7 - C96F3F - C98A88
C9A5D0-C9C118-C9DC61-C9F7A9-CA12F2-CA2E3A-CA4982-CA64CB
CA8013-CA9B5B-CAB6A4-CAD1EC-CAED35-CB087D-CB23C5-CB3F0E
CB5A56 - CB759E - CB90E7 - CBAC2F - CBC778 - CBE2C0 - CBFE08 - CC1951
CC3499-CC4FE1-CC6B2A-CC8672-CCA1BB-CCBD03-CCD84B-CCF394
CD0EDC-CD2A24-CD456D-CD60B5-CD7BFE-CD9746-CDB28E-CDCDD7
CDE91F - CE0467 - CE1FB0 - CE3AF8 - CE5641 - CE7189 - CE8CD1 - CEA81A
CEC362-CEDEAA-CEF9F3-CF153B-CF3084-CF4BCC-CF6714-CF825D
CF9DA5 - CFB8ED - CFD436 - CFEF7E - D00AC7 - D0260F - D04157 - D05CA0
D077E8 - D09330 - D0AE79 - D0C9C1 - D0E50A - D10052 - D11B9A - D136E3
D1522B - D16D73 - D188BC - D1A404 - D1BF4D - D1DA95 - D1F5DD - D21126
D22C6E - D247B6 - D262FF - D27E47 - D29990 - D2B4D8 - D2D020 - D2EB69
D306B1 - D321F9 - D33D42 - D3588A - D373D3 - D38F1B - D3AA63 - D3C5AC
D3E0F4 - D3FC3C - D41785 - D432CD - D44E16 - D4695E - D484A6 - D49FEF
D4BB37 - D4D67F - D4F1C8 - D50D10 - D52859 - D543A1 - D55EE9 - D57A32
D5957A - D5B0C2 - D5CC0B - D5E753 - D6029C - D61DE4 - D6392C - D65475
D66FBD - D68B05 - D6A64E - D6C196 - D6DCDF - D6F827 - D7136F - D72EB8
D74A00 - D76548 - D78091 - D79BD9 - D7B722 - D7D26A - D7EDB2 - D808FB
D82443 - D83F8B - D85AD4 - D8761C - D89165 - D8ACAD - D8C7F5 - D8E33E
D8FE86 - D919CE - D93517 - D9505F - D96BA8 - D986F0 - D9A238 - D9BD81
D9D8D9
Codepad with 2 versions of this code