У меня есть два массива, один массив содержит шестнадцатеричные значения цвета, которые будут использоваться, тогда как другой массив содержит избыточные шестнадцатеричные значения и должен быть сопоставлен с массивом ссылок, а его значение обновляется до индекса ссылки.
Например, вот пример (сокращенная версия) ссылки, с которой я буду проверять.
$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 / G / B).
Если вы добавите различия, то с наименьшей комбинированной разницей следует обеспечить близкое цветовое сходство …
Хотя, как уже упоминалось в duskwuff, восприятие цвета является субъективным.
Есть несколько способов сделать это. Вам нужна функция, чтобы найти разницу в значениях между двумя шестнадцатеричными значениями. Вы можете реализовать это, как хотите. Возможно, было бы проще просто преобразовать его в десятичный для поиска разницы. Если ваш массив не отсортирован уже на основе шестнадцатеричных значений, то то, что вы можете сделать, – это захватить каждое значение массива и сравнить его и сохранить разность и индекс в 2 переменных. Перейдем через массив и сравним значение с каждым значением в массиве, и всякий раз, когда вы находите разницу, меньшую, чем то, что хранится в вашей переменной, вы должны обновить временные индексы и переменные diff с новой меньшей разницей. Это не очень эффективно, так как вам нужно пройти весь массив. Что может быть более эффективным, это реализовать отсортированный список, а затем сравнить шестнадцатеричное значение с теми, что указаны в списке, и найти подходящее место в отсортированном списке.
Например, в этом списке: 0 1 4 8 13 19
если вы хотите найти, какой номер является самым близким по значению к числу 10
тогда все, что вам нужно сделать, это найти, где 10 вписывается в этот список, а затем сравнить его с элементом до и после, и у вас будут ответы.
Существует несколько способов измерения «разницы» двух цветов. Какие из них являются более «правильными», чем другие, являются своего рода субъективным вопросом.
В Википедии есть статья по этому вопросу в разделе « Разница цветов» . Приготовьтесь немного закрутить голову.