Определите ближайший гексаговый цвет к списку существующих шестнадцатеричных значений

У меня есть два массива, один массив содержит шестнадцатеричные значения цвета, которые будут использоваться, тогда как другой массив содержит избыточные шестнадцатеричные значения и должен быть сопоставлен с массивом ссылок, а его значение обновляется до индекса ссылки.

Например, вот пример (сокращенная версия) ссылки, с которой я буду проверять.

$ref_array = array(4 => '000000', 66 => 'C31AOC', 162 => 'AD2823'); 

И вот массив, который должен соответствовать как можно ближе к ссылке.

 $orig_array = array('1' => '2be944', 2 => '2f3136', 3 => '88110d'); 

Они arent orig_array не в порядке против ref_array.

Я не уверен, что это возможно в PHP, но предположим, что первый элемент в orig_array является зеленоватым цветом, а в ссылочном массиве ближайший цвет – 2be944, поэтому для этого примера будет создан новый массив:

 $new_array('2be944' => 4) 

Он содержит значение индекса orig_array

Как мне это сделать или что-то подобное?

Помимо научного подхода к делу …

Помните, что шестнадцатеричный цветовой код состоит из трех двухзначных шестнадцатеричных чисел (RGB-значений)! Таким образом, вы не можете делать все сразу, потому что первые две цифры в противном случае увеличивают ваше десятичное значение слишком сильно) …

Вот как я это сделаю.

Вы можете разделить свой цветовой код на 3 части:

  • R = 2B -> 43 десятичных
  • G = E9 -> 233 десятичных
  • B = 44 -> 68 десятичных

Затем вы можете сравнить каждый цвет с ссылками (также разделить их на R / G / B).

Если вы добавите различия, то с наименьшей комбинированной разницей следует обеспечить близкое цветовое сходство …

Хотя, как уже упоминалось в duskwuff, восприятие цвета является субъективным.

Есть несколько способов сделать это. Вам нужна функция, чтобы найти разницу в значениях между двумя шестнадцатеричными значениями. Вы можете реализовать это, как хотите. Возможно, было бы проще просто преобразовать его в десятичный для поиска разницы. Если ваш массив не отсортирован уже на основе шестнадцатеричных значений, то то, что вы можете сделать, – это захватить каждое значение массива и сравнить его и сохранить разность и индекс в 2 переменных. Перейдем через массив и сравним значение с каждым значением в массиве, и всякий раз, когда вы находите разницу, меньшую, чем то, что хранится в вашей переменной, вы должны обновить временные индексы и переменные diff с новой меньшей разницей. Это не очень эффективно, так как вам нужно пройти весь массив. Что может быть более эффективным, это реализовать отсортированный список, а затем сравнить шестнадцатеричное значение с теми, что указаны в списке, и найти подходящее место в отсортированном списке.

Например, в этом списке: 0 1 4 8 13 19 если вы хотите найти, какой номер является самым близким по значению к числу 10 тогда все, что вам нужно сделать, это найти, где 10 вписывается в этот список, а затем сравнить его с элементом до и после, и у вас будут ответы.

Существует несколько способов измерения «разницы» двух цветов. Какие из них являются более «правильными», чем другие, являются своего рода субъективным вопросом.

В Википедии есть статья по этому вопросу в разделе « Разница цветов» . Приготовьтесь немного закрутить голову.