Цветове по нюанси

dakata__92

Super Moderator
Имам масив с цветове от типа hex. Как мога да направя така, че да го подредя по нюанс на даден цвят. Примерно по-светлите клонящи към бяло да са подредени първи и надолу тези които клонят към черно или червено и прочие.

PHP:
$arr = array('ffffff', 'f0f0f0', '000000', '600000', '004080', 'f0f0e0', '202060', '000040', '202040', 'e08040');
Просто да са подредени по нюанси. Пробвах с функции от ръководството но не е това което търся.
http://bg2.php.net/manual/bg/ref.array.php
 
1. http://stackoverflow.com/questions/16174504/sorting-colors-by-hue-in-php
2. http://forums.phpfreaks.com/topic/62047-solved-sorting-color-swatches-based-off-from-rgb-info/
3. http://graphicmaniacs.com/note/convert-rgb-to-hsl-in-php-and-sort-by-color/

Разгледай ги и 3-те ;)
:?: :?:
 
Разгледах ги но нещо не ми се получават размислите. На места от HEX преминаваме в DEC или обратното... Интересува ме най-простото сортиране което е възможно по цветови нюанси. Погледнах кодовете нооо нещо не се справям в опростяването на функциите. Нека преди foreach ако е възможно да има сортиране за да се получи.
PHP:
<?php


$a = array(
"#000000","#FFFFFF","#642424","#CC0605","#CB2821","#A2231D",
"#AF2B1E","#BF4435","#F54021","#C93C20","#FFDDD6","#F44611","#F75E25","#C1876B",
"#FABFA1","#734222","#FF7514","#FFCC99","#8A6642","#FDF4E3","#F3A505","#C6A664",
"#F4A900","#C2B078","#F5CB21","#E6D690","#FAD201","#E1CC4F","#F3DA0B","#7E7B52",
"#FFFCC1","#B8B799","#F8F32B","#FFFF99","#EDFF21","#B8CE3B","#424632","#343B29",
"#85BD3E","#31372B","#79BB51","#89AC76","#4FAE2E","#C0DEBC","#2D572C","#8D948D",
"#1CA744","#1E5945","#39B49F","#3F888F","#439AA4","#256D7B","#434B4D","#293133",
"#008FB7","#0D3A4D","#D0E6F1","#474B4E","#2271B3","#0E294B","#0B2C59","#0E3987",
"#4170CC","#1D1E33","#A49FC7","#6C3EC3","#261448","#986DE9","#37225D","#260B3E",
"#D8C6DE","#6C4675","#FFA3FF","#E54EE5","#6D3F5B","#D569A7","#A03472","#9E1A65",
"#421C31","#CF3476","#DE4C8A","#4A192C","#641C34","#F8C5CE","#EA899A","#412227",
"#5E2129","#9B111E","#75151E","#D60B11","#D36E70","#D53032" );  




foreach ($a as $key => $value) 
{
    echo "<div style=\"width:390px; height:40px; background:$value;\"> $value</div>";
}

?>
 
Ето ти сортиране от тъмни към светли:
Код:
<?php
$a = array(
"#000000","#FFFFFF","#642424","#CC0605","#CB2821","#A2231D",
"#AF2B1E","#BF4435","#F54021","#C93C20","#FFDDD6","#F44611","#F75E25","#C1876B",
"#FABFA1","#734222","#FF7514","#FFCC99","#8A6642","#FDF4E3","#F3A505","#C6A664",
"#F4A900","#C2B078","#F5CB21","#E6D690","#FAD201","#E1CC4F","#F3DA0B","#7E7B52",
"#FFFCC1","#B8B799","#F8F32B","#FFFF99","#EDFF21","#B8CE3B","#424632","#343B29",
"#85BD3E","#31372B","#79BB51","#89AC76","#4FAE2E","#C0DEBC","#2D572C","#8D948D",
"#1CA744","#1E5945","#39B49F","#3F888F","#439AA4","#256D7B","#434B4D","#293133",
"#008FB7","#0D3A4D","#D0E6F1","#474B4E","#2271B3","#0E294B","#0B2C59","#0E3987",
"#4170CC","#1D1E33","#A49FC7","#6C3EC3","#261448","#986DE9","#37225D","#260B3E",
"#D8C6DE","#6C4675","#FFA3FF","#E54EE5","#6D3F5B","#D569A7","#A03472","#9E1A65",
"#421C31","#CF3476","#DE4C8A","#4A192C","#641C34","#F8C5CE","#EA899A","#412227",
"#5E2129","#9B111E","#75151E","#D60B11","#D36E70","#D53032" );  

function cf_sort_hex_colors($colors) {
	$map = array(
		'0' => 0,
		'1' => 1,
		'2' => 2,
		'3' => 3,
		'4' => 4,
		'5' => 5,
		'6' => 6,
		'7' => 7,
		'8' => 8,
		'9' => 9,
		'a' => 10,
		'b' => 11,
		'c' => 12,
		'd' => 13,
		'e' => 14,
		'f' => 15,
	);
	$c = 0;
	$sorted = array();
	foreach ($colors as $color) {
		$color = strtolower(str_replace('#', '', $color));
		if (strlen($color) == 6) {
			$condensed = '';
			$i = 0;
			foreach (preg_split('//', $color, -1, PREG_SPLIT_NO_EMPTY) as $char) {
				if ($i % 2 == 0) {
					$condensed .= $char;
				}
				$i++;
			}
			$color_str = $condensed;
		}
		$value = 0;
		foreach (preg_split('//', $color_str, -1, PREG_SPLIT_NO_EMPTY) as $char) {
			$value += intval($map[$char]);
		}
		$value = str_pad($value, 5, '0', STR_PAD_LEFT);
		$sorted['_'.$value.$c] = '#'.$color;
		$c++;
	}
	ksort($sorted);
	return $sorted;
}

$a = cf_sort_hex_colors($a);

foreach ($a as $key => $value) 
{
    echo "<div style=\"width:390px; height:40px; background:$value;\"> $value</div>";
}

Или пък така:
Код:
<?php

$colors = array(
	"#000000","#FFFFFF","#642424","#CC0605","#CB2821","#A2231D",
	"#AF2B1E","#BF4435","#F54021","#C93C20","#FFDDD6","#F44611","#F75E25","#C1876B",
	"#FABFA1","#734222","#FF7514","#FFCC99","#8A6642","#FDF4E3","#F3A505","#C6A664",
	"#F4A900","#C2B078","#F5CB21","#E6D690","#FAD201","#E1CC4F","#F3DA0B","#7E7B52",
	"#FFFCC1","#B8B799","#F8F32B","#FFFF99","#EDFF21","#B8CE3B","#424632","#343B29",
	"#85BD3E","#31372B","#79BB51","#89AC76","#4FAE2E","#C0DEBC","#2D572C","#8D948D",
	"#1CA744","#1E5945","#39B49F","#3F888F","#439AA4","#256D7B","#434B4D","#293133",
	"#008FB7","#0D3A4D","#D0E6F1","#474B4E","#2271B3","#0E294B","#0B2C59","#0E3987",
	"#4170CC","#1D1E33","#A49FC7","#6C3EC3","#261448","#986DE9","#37225D","#260B3E",
	"#D8C6DE","#6C4675","#FFA3FF","#E54EE5","#6D3F5B","#D569A7","#A03472","#9E1A65",
	"#421C31","#CF3476","#DE4C8A","#4A192C","#641C34","#F8C5CE","#EA899A","#412227",
	"#5E2129","#9B111E","#75151E","#D60B11","#D36E70","#D53032" 
); 


function sortColorsByColor($rgblist) {
	$sort = array();
	foreach($rgblist as $rgb) {
		$hsl = hexToHsl(hexdec(substr($rgb, 0, 2)), hexdec(substr($rgb, 2, 2)), hexdec(substr($rgb, 4, 2)));
		$sort[] = $hsl['h'];
	}
	array_multisort($sort, SORT_ASC, $rgblist);
	return $rgblist;
}

function hexToHsl($hex)
{
	$r = hexdec(substr($hex, 0, 2));
	$g = hexdec(substr($hex, 2, 2));
	$b = hexdec(substr($hex, 4, 2));

    $r /= 255; 
    $g /= 255; 
    $b /= 255;
    $max = max($r, $g, $b);
        $min = min($r, $g, $b);
    $h = 0;
    $s = 0;
    $l = ($max + $min) / 2;
 
    if($max == $min){
        $h = $s = 0; 
    }else{
        $d = $max - $min;
        $s = $l > 0.5 ? $d / (2 - $max - $min) : $d / ($max + $min);
        switch($max){
            case $r: $h = ($g - $b) / $d + ($g < $b ? 6 : 0); break;
            case $g: $h = ($b - $r) / $d + 2; break;
            case $b: $h = ($r - $g) / $d + 4; break;
        }
        $h /= 6;
    }
 
    return array('h' => $h, 's' => $s, 'l' => $l);
}

$a = sortColorsByColor($colors);

foreach ($a as $key => $value) 
{
    echo "<div style=\"width:390px; height:40px; background:$value;\"> $value</div>";
}
 

Back
Горе