Hi Everyone, I'm working on a project which will eventually work its way into a website design and came upon a color sorting problem. I found a potential great solution on Stack Overflow using the PHP language but I can't get the code to work. I've never coded in PHP and I've not coded much in years... I was wondering if someone could help me trouble shoot my code below?
Here is the stack overflow answer: http://stackoverflow.com/a/31742242/5807915, I didn't ask any further questions over there, that community intimidates me!
Here is my set of colors and the code that I've pulled together that I'm trying to get to work in this PHP http://phpfiddle.org/ code editor:
<?php
$colors = [
[ 'color'=> '# 000000 '],
[ 'color'=> '# 97233F '],
[ 'color'=> '# 841F27 '],
[ 'color'=> '# A71930 '],
[ 'color'=> '# EF0107 '],
[ 'color'=> '# 94BEE5 '],
[ 'color'=> '# CE1141 '],
[ 'color'=> '# E13A3E '],
[ 'color'=> '# DF4601 '],
[ 'color'=> '# 241773 '],
[ 'color'=> '# 008348 '],
[ 'color'=> '# BD3039 '],
[ 'color'=> '# 061922 '],
[ 'color'=> '# 00338D '],
[ 'color'=> '# 002E62 '],
[ 'color'=> '# 8CCCE5 '],
[ 'color'=> '# E03A3E '],
[ 'color'=> '# 0085CA '],
[ 'color'=> '# 1D1160 '],
[ 'color'=> '# 034694 '],
[ 'color'=> '# 0B162A '],
[ 'color'=> '# E3263A '],
[ 'color'=> '# CC3433 '],
[ 'color'=> '# AF2626 '],
[ 'color'=> '# AA002C '],
[ 'color'=> '# C6011F '],
[ 'color'=> '# FB4F14 '],
[ 'color'=> '# 860038 '],
[ 'color'=> '# E31937 '],
[ 'color'=> '# 8B2942 '],
[ 'color'=> '# 91022D '],
[ 'color'=> '# 333366 '],
[ 'color'=> '# 00285C '],
[ 'color'=> '# 1B458F '],
[ 'color'=> '# 002244 '],
[ 'color'=> '# 007DC5 '],
[ 'color'=> '# 006A4E '],
[ 'color'=> '# 4D90CD '],
[ 'color'=> '# 005A8B '],
[ 'color'=> '# ED174C '],
[ 'color'=> '# EC1F26 '],
[ 'color'=> '# 0C2C56 '],
[ 'color'=> '# 003777 '],
[ 'color'=> '# 274488 '],
[ 'color'=> '# CF0032 '],
[ 'color'=> '# C8213F '],
[ 'color'=> '# FDB927 '],
[ 'color'=> '# 203731 '],
[ 'color'=> '# 002D62 '],
[ 'color'=> '# F36600 '],
[ 'color'=> '# 03202F '],
[ 'color'=> '# F5A12D '],
[ 'color'=> '# FFC633 '],
[ 'color'=> '# 002C5F '],
[ 'color'=> '# E31837 '],
[ 'color'=> '# 004687 '],
[ 'color'=> '# FDBE11 '],
[ 'color'=> '# 00A398 '],
[ 'color'=> '# BA0021 '],
[ 'color'=> '# EF3E42 '],
[ 'color'=> '# 00245D '],
[ 'color'=> '# 5CBFEB '],
[ 'color'=> '# DA020E '],
[ 'color'=> '# 0F586C '],
[ 'color'=> '# 008E97 '],
[ 'color'=> '# 98002E '],
[ 'color'=> '# FF6600 '],
[ 'color'=> '# 0A2351 '],
[ 'color'=> '# 00471B '],
[ 'color'=> '# 005083 '],
[ 'color'=> '# 002B5C '],
[ 'color'=> '# 4F2683 '],
[ 'color'=> '# 025736 '],
[ 'color'=> '# BF2F38 '],
[ 'color'=> '# 122089 '],
[ 'color'=> '# FDBB2F '],
[ 'color'=> '# 0A2141 '],
[ 'color'=> '# 9F8958 '],
[ 'color'=> '# 6CADDF '],
[ 'color'=> '# 0B2265 '],
[ 'color'=> '# 00529B '],
[ 'color'=> '# 006BB6 '],
[ 'color'=> '# FF5910 '],
[ 'color'=> '# 0161AB '],
[ 'color'=> '# D50031 '],
[ 'color'=> '# E4002B '],
[ 'color'=> '# 00B6F1 '],
[ 'color'=> '# 003831 '],
[ 'color'=> '# A5ACAF '],
[ 'color'=> '# 007DC3 '],
[ 'color'=> '# 633492 '],
[ 'color'=> '# E4173E '],
[ 'color'=> '# 004953 '],
[ 'color'=> '# F47940 '],
[ 'color'=> '# 284898 '],
[ 'color'=> '# 001B2D '],
[ 'color'=> '# E56020 '],
[ 'color'=> '# FDB827 '],
[ 'color'=> '# 004812 '],
[ 'color'=> '# 005CAB '],
[ 'color'=> '# A50531 '],
[ 'color'=> '# 724C9F '],
[ 'color'=> '# BAC3C9 '],
[ 'color'=> '# 05143F '],
[ 'color'=> '# AA0000 '],
[ 'color'=> '# FD5A1E '],
[ 'color'=> '# 0051BA '],
[ 'color'=> '# 05535D '],
[ 'color'=> '# 4F8A10 '],
[ 'color'=> '# ED1A3B '],
[ 'color'=> '# 91B0D5 '],
[ 'color'=> '# 0546A0 '],
[ 'color'=> '# C41E3A '],
[ 'color'=> '# EB172B '],
[ 'color'=> '# D50A0A '],
[ 'color'=> '# 013E7D '],
[ 'color'=> '# 092C5C '],
[ 'color'=> '# C0111F '],
[ 'color'=> '# 134A8E '],
[ 'color'=> '# D80016 '],
[ 'color'=> '# 001C58 '],
[ 'color'=> '# 07346F '],
[ 'color'=> '# 12264C '],
[ 'color'=> '# CF132B '],
[ 'color'=> '# AB0003 '],
[ 'color'=> '# 773141 '],
[ 'color'=> '# 091453 '],
[ 'color'=> '# 60223B '],
[ 'color'=> '# 91764B '],
[ 'color'=> '# 023474 '],
[ 'color'=> '# 7A003C '],
[ 'color'=> '# 13274F '],
[ 'color'=> '# C4D600 '],
[ 'color'=> '# FFC422 '],
[ 'color'=> '# BB9753 '],
[ 'color'=> '# 0D2B56 '],
[ 'color'=> '# E03A3F '],
[ 'color'=> '# 565A5C '],
[ 'color'=> '# B95915 '],
[ 'color'=> '# B1BABF '],
[ 'color'=> '# C60C30 '],
[ 'color'=> '# FAB383 '],
[ 'color'=> '# A9B0B8 '],
[ 'color'=> '# 313F49 '],
[ 'color'=> '# 20385B '],
[ 'color'=> '# D7A22A '],
[ 'color'=> '# BEC0C2 '],
[ 'color'=> '# FFD200 '],
[ 'color'=> '# 8177B7 '],
[ 'color'=> '# BCBEC0 '],
[ 'color'=> '# FFE600 '],
[ 'color'=> '# EEE3C7 '],
[ 'color'=> '# 231F20 '],
[ 'color'=> '# 8A8D8F '],
[ 'color'=> '# F0B83D '],
[ 'color'=> '# C4CED3 '],
[ 'color'=> '# F9A01B '],
[ 'color'=> '# 00539B '],
[ 'color'=> '# FF7900 '],
[ 'color'=> '# B4975A '],
[ 'color'=> '# 5B2B2F '],
[ 'color'=> '# 006778 '],
[ 'color'=> '# C09A5B '],
[ 'color'=> '# 0053A0 '],
[ 'color'=> '# D00027 '],
[ 'color'=> '# 003263 '],
[ 'color'=> '# 005A9C '],
[ 'color'=> '# 004689 '],
[ 'color'=> '# AFB7BA '],
[ 'color'=> '# 552582 '],
[ 'color'=> '# FFCE65 '],
[ 'color'=> '# FFE500 '],
[ 'color'=> '# 7399C6 '],
[ 'color'=> '# F58220 '],
[ 'color'=> '# 0077C8 '],
[ 'color'=> '# B6922E '],
[ 'color'=> '# F0EBD2 '],
[ 'color'=> '# 00A94F '],
[ 'color'=> '# D31145 '],
[ 'color'=> '# FFC62F '],
[ 'color'=> '# BF2B37 '],
[ 'color'=> '# 213770 '],
[ 'color'=> '# 00285E '],
[ 'color'=> '# F57D31 '],
[ 'color'=> '# F58426 '],
[ 'color'=> '# 002D72 '],
[ 'color'=> '# E6393F '],
[ 'color'=> '# 012055 '],
[ 'color'=> '# 003087 '],
[ 'color'=> '# BBBDBF '],
[ 'color'=> '# EFB21E '],
[ 'color'=> '# F05133 '],
[ 'color'=> '# FDE192 '],
[ 'color'=> '# E81828 '],
[ 'color'=> '# B18500 '],
[ 'color'=> '# D1BD80 '],
[ 'color'=> '# EBE72B '],
[ 'color'=> '# 013474 '],
[ 'color'=> '# 8E9090 '],
[ 'color'=> '# 0073CF '],
[ 'color'=> '# B3995D '],
[ 'color'=> '# F38F20 '],
[ 'color'=> '# 005C5C '],
[ 'color'=> '# 69BE28 '],
[ 'color'=> '# 11568C '],
[ 'color'=> '# 211E1F '],
[ 'color'=> '# FFC325 '],
[ 'color'=> '# 000066 '],
[ 'color'=> '# 1B449C '],
[ 'color'=> '# A68A26 '],
[ 'color'=> '# 34302B '],
[ 'color'=> '# 8FBCE6 '],
[ 'color'=> '# 4B92DB '],
[ 'color'=> '# 003278 '],
[ 'color'=> '# 1D2D5C '],
[ 'color'=> '# 047A4A '],
[ 'color'=> '# 00214E '],
[ 'color'=> '# 11225B '],
[ 'color'=> '# F7C240 '],
[ 'color'=> '# 0168AB '],
[ 'color'=> '# EF5225 '],
[ 'color'=> '# FFB612 '],
[ 'color'=> '# EFE1C6 '],
[ 'color'=> '# E3D4AD '],
[ 'color'=> '# 9C824A '],
];
foreach ($colors as &$color) {
$color['hsl'] = hexToHsl($color['color']);
}
/**
* Convert a hexadecimal color in RGB
* @param string $hex
* @return array
*/
function hexToHsl($hex){
list($r, $g, $b) = sscanf($hex, "#%02x%02x%02x");
return rgbToHsl($r, $g, $b);
}
/**
* Convert a RGB color in its HSL value
* @param int $r red
* @param int $g green
* @param int $b blue
* @return array
*/
function rgbToHsl($r, $g, $b)
{
$r /= 255;
$g /= 255;
$b /= 255;
$max = max($r, $g, $b);
$min = min($r, $g, $b);
$h = 0;
$l = ($max + $min) / 2;
$d = $max - $min;
if ($d == 0) {
$h = $s = 0; // achromatic
} else {
$s = $d / (1 - abs(2 * $l - 1));
switch ($max) {
case $r:
$h = 60 * fmod((($g - $b) / $d), 6);
if ($b > $g) {
$h += 360;
}
break;
case $g:
$h = 60 * (($b - $r) / $d + 2);
break;
case $b:
$h = 60 * (($r - $g) / $d + 4);
break;
}
}
return array('h' => round($h, 2), 's' => round($s, 2), 'l' => round($l, 2));
}
usort($colors, function ($a, $b) {
//Compare the hue when they are in the same "range"
if(!huesAreinSameInterval($a['hsl']['h'],$b['hsl']['h'])){
if ($a['hsl']['h'] < $b['hsl']['h'])
return -1;
if ($a['hsl']['h'] > $b['hsl']['h'])
return 1;
}
if ($a['hsl']['l'] < $b['hsl']['l'])
return 1;
if ($a['hsl']['l'] > $b['hsl']['l'])
return -1;
if ($a['hsl']['s'] < $b['hsl']['s'])
return -1;
if ($a['hsl']['s'] > $b['hsl']['s'])
return 1;
return 0;
});
/**
* Check if two hues are in the same given interval
* @param float $hue1
* @param float $hue2
* @param int $interval
* @return bool
*/
function huesAreinSameInterval($hue1, $hue2, $interval = 30){
return (round(($hue1 / $interval), 0, PHP_ROUND_HALF_DOWN) === round(($hue2 / $interval), 0, PHP_ROUND_HALF_DOWN));
}
?>