Полезные PHP коды — для опытных
Несколько готовых сниппетов для решения конкретных задач в PHP. Эти приемы рассчитаны на пользователей, которые знакомы с PHP. Коды ниже могут стать готовым решением или основной для очередного велосипеда. А также хорошей основой для понимания некоторых моментов, касательно того как решаются разные задачи в PHP. В общем, читайте и выносите для себя что-то новое...
См. также: Полезные PHP коды - для новичков
Как наложить водяной знак или текст на картинку в PHP
Накладываем водяной знак
Пример ниже показывает как наложить одну картинку на другую, при этом первой картинке будет задана прозрачность в 60% и размещена она будет в нижний правый угол второй картинки.
/** * Накладывает указанный водяной знак на указанную картинку и выводит результат на экран. * @param string $img_path Путь до картинки JPG формата. Исходная картинка * @param string $watermark_path Путь до картинки JPG формата - картинка - водяной знак * @param string [$save_path = NULL] Путь для сохранения файла. Если равен NULL, изображение будет выведено на экран в бинарном виде. */ function apply_watermark( $img_path, $watermark_path, $save_path = NULL ){ // получаем размеры обоих картинок $size = getimagesize( $img_path ); $size_wm = getimagesize( $watermark_path ); $height = $size[1]; // высота $width = $size[0]; // ширина $height_wm = $size_wm[1]; $width_wm = $size_wm[0]; // определим формат $img_ext = preg_match('~.png$~i', $img_path) ? 'png' : 'jpg'; $wm_ext = preg_match('~.png$~i', $img_path) ? 'png' : 'jpg'; // загружаем изображения $image = $img_ext === 'jpg' ? imagecreatefromjpeg( $img_path ) : imagecreatefrompng( $img_path ); $watermark = $wm_ext === 'jpg' ? imagecreatefromjpeg( $watermark_path ) : imagecreatefrompng( $watermark_path ); $opacity = 60; // прозрачность // высчитываем координаты для наложения водяного знака $x = $width - $width_wm; $y = $height - $height_wm; // объединяем две картинки imagecopymerge( $image, $watermark, $x, $y, 0, 0, $width_wm, $height_wm, $opacity ); if( ! $save_path ){ // задаем заголовок, чтоб вывести результат в браузере header('Content-Type: image/jpeg'); } imagejpeg( $image, $save_path ); // очищаем память imagedestroy( $image ); imagedestroy( $watermark ); }
Пример использования функции
$uploads = wp_get_upload_dir()['basedir']; $img_path = $uploads . '/2017/03/Poisk-nuzhnyh-kvorkov-po-razdelam.png'; $watermark_path = $uploads . '/2013/10/yandex.png'; // записываем результат в файл my_image.jpg в корне сайта apply_watermark( $img_path, $watermark_path, $_SERVER['DOCUMENT_ROOT'] .'/my_image.jpg' ); echo '<img src="'. home_url('my_image.jpg') .'" alt="">';
Накладываем текст
Для нанесения текста в любой кодировке и на любом языке возможно благодаря сторонним шрифтам.
В основе примера используется функция — imagettftext(). Она может принимать несколько значений: размер текста в пикселях, цвет, начало текста относительно координат по осям X и Y, сам наносимый текст и самое главное, файл шрифта, который позволит наносить текст в нужной кодировке.
$width = 200; // ширина изображения $height = 100; // высота изображения // создаем изображение, на котором будем рисовать $img = imagecreatetruecolor( $width, $height ); $rgb = 0xFFFFFF; // цвет заливки фона imagefill( $img, 0, 0, $rgb ); // заливаем холст цветом $rgb $fontName = "impact.ttf"; // путь к шрифту $font_sise = 18; // размер шрифта $textColor = 0x000000; // цвет шрифта $x = 50; // отступ слева $y = 50; // отступ справа // текст, который будем наносить на картинку n обозначает переход на новую строку $text = 'Текстn кириллица'; // нанесение текста imagettftext( $img, $font_sise, 0, $x, $y, $textColor, $fontName, $text ); // выводим результат в браузер header("Content-Type: image/png"); imagepng( $img ); // очищаем память imagedestroy( $img );
Нанесение на изображение текста с обводкой
Для создания обводки специальных функций в PHP нет. Но её можно сделать через функцию — imagettftext(). Нужно вывести текст много раз - девять. Да, девять раз, из них восемь раз вывод текста нужно делать цветом обводки, постоянно смещая текст 1-2 пикселя влево, вправо, вниз, вверх, влево и вверх, вправо и вверх, вправо и вниз, влево и вниз. И девятый раз выводим текст уже тем цветом, которого он должен быть.
$width = 200; // ширина изображения $height = 100; // высота изображения // создаем изображение, на котором будем рисовать $img = imagecreatetruecolor($width, $height); $rgb = 0xFFFFFF; // цвет заливки фона imagefill( $img, 0, 0, $rgb ); // заливаем холст цветом $rgb $fontName = "impact.ttf"; // путь к шрифту $fontSise = 18; // размер шрифта $textColor = 0xFFFFFF; // цвет шрифта $aroundColor = 0x000000; // цвет обводки $x = 50; // отступ слева $y = 50; // отступ справа // текст, который будем наносить на картинку n обозначает переход на новую строку $text = "Текстn кириллица"; // обводка текста imagettftext( $img, $fontSise, 0, $x+2, $y, $aroundColor, $fontName, $text ); // смещение вправо imagettftext( $img, $fontSise, 0, $x-2, $y, $aroundColor, $fontName, $text ); // смещение влево imagettftext( $img, $fontSise, 0, $x, $y+2, $aroundColor, $fontName, $text ); // смещение вниз imagettftext( $img, $fontSise, 0, $x, $y-2, $aroundColor, $fontName, $text ); // смещение вверх imagettftext( $img, $fontSise, 0, $x+1, $y+1, $aroundColor, $fontName, $text ); // смещение вправо и вниз imagettftext( $img, $fontSise, 0, $x+1, $y-1, $aroundColor, $fontName, $text ); // смещение вправо и вверх imagettftext( $img, $fontSise, 0, $x-1, $y-1, $aroundColor, $fontName, $text ); // смещение влево и вверх imagettftext( $img, $fontSise, 0, $x-1, $y+1, $aroundColor, $fontName, $text ); // смещение влево и вниз imagettftext( $img, $fontSise, 0, $x, $y, $textColor, $fontName, $text ); // вывод самого текста // выводим результат в браузер header("Content-Type: image/png"); imagepng( $img ); imagedestroy( $img ); // очищаем память
Нанесение на изображение текста с подчеркиванием
Для этих целей стандартных PHP функций нет. Поэтому нужно вывести текст и нарисовать под ним линию. Сложность в том, что необходимо знать координаты нанесения линии и ее длину. Для определения начала линии можно воспользоваться координатами самого текста, только прибавить к значению по оси Y размер самого текста. А для получения длины, можно воспользоваться функцией imagettfbbox(), которая определяет положение текста. Функция возвращает массив с восемью элементами, координаты углов, обрамляющей текст рамки. Используя полученные, координаты, можно высчитать длину текста.
$width = 200; // ширина изображения $height = 100; // высота изображения // создаем изображение, на котором будем рисовать $img = imagecreatetruecolor( $width, $height ); $rgb = 0xFFFFFF; // цвет заливки фона imagefill( $img, 0, 0, $rgb ); // заливаем холст цветом $rgb $fontName = "impact.ttf"; // путь к шрифту $fontSise = 18; // размер шрифта $textColor = 0x000000; // цвет шрифта $paddingLine = 3; // отступ линии от начала текста $x = 50; // отступ слева $y = 50; // отступ справа // текст, который будем наносить на картинку $text = "Любой текст"; // выводим текст imagettftext( $img, $fontSise, 0, $x, $y, $textColor, $fontName, $text ); // определяем размер текста $textbox = imagettfbbox( $fontSise, 0, $fontName, $text ); // вычисляем ширину текста $text_width = $textbox[2] - $textbox[ 0]; // толщина линии imagesetthickness( $img, 3 ); // рисуем линию imageline( $img, $x, $y + $paddingLine, $x + $text_width, $y + $paddingLine, $textColor ); // выводим результат в браузер header("Content-Type: image/png"); imagepng( $img ); imagedestroy( $img ); // очищаем память
Экранирование строк в регулярных выражениях
Если в «регулярку» передается динамичная строка, то её принято экранировать с помощью preg_quote(). Однако иногда такой экран может не подойти, когда, например, не нужно экранировать символ :
допустим в url.
В этом случае может пригодится менее известная функция quotemeta() - она не экранирует символы: { } = ! < > | : -
.
Смотрите разницу:
preg_quote( '. + * ? [ ^ ] $ ( ) { } = ! < > | : -' ); // получим: \. \+ \* \? \[ \^ \] \$ \( \) \{ \} \= \! < \> \| \: \- quotemeta( '. + * ? [ ^ ] $ ( ) { } = ! < > | : -' ); // получим: \. \+ \* \? \[ \^ \] \$ \( \) { } = ! < > | : -
Обратите внимание, что символ /
не является служебным и не экранируется нигде.
В preg_quote() можно указать второй параметр, тогда указанный там символ тоже будет экранироваться:
$str = '(40км/ч)'; preg_quote( $str ); //> (40км/ч) preg_quote( $str, '/' ); //> (40км/ч)
Как разбить предложение на слова в PHP
Build In PostЧтобы разбить строку на отдельные слова, можно использовать PHP функцию – strtok( $str, $token )
. Она принимает два параметра: строку и символы, по которым строка будет разбиваться на части.
strtok() разбивает строку $str на подстроки (токены), используя в качестве разделителей символы из $token.
Например, строку "Это примерная строка" можно разбить на отдельные слова используя пробел в качестве разделителя.
$string = "Бог наградил в нем слог и ум покорный, Стал Моисей известный господин..."; $sep = " \n\t"; // В качестве разделителей используем пробел, табуляцию и перевод строки $token = strtok( $string, $sep ); while ( $token !== false ) { echo "word = $token\n"; $token = strtok( $sep ); } /* Word = Бог Word = наградил Word = в Word = нем Word = слог Word = и Word = ум Word = покорный, Word = Стал Word = Моисей Word = известный Word = господин... */
Заметьте, что исходная строка передается только при первом вызове strtok(). Последующим вызовам передаются только разделители, так как эта функция сохраняет исходную строку и запоминает позицию в этой строке между вызовами. Для работы с новой строкой нужно снова вызвать функцию с двумя аргументами.
Обратите внимание, что в параметре token можно использовать несколько разделителей. Строка будет делиться по любому найденному символу, присутствующему в этом параметре.
Склонение слов после чистительных (на PHP)
Build In PostНе редко возникает необходимость вывода числа с подписью и в этом случае в русском языке окончание подписи будет зависеть от того какое число указано. Например, вывод количества дней: 1 день
, 2 дня
, 5 дней
. Как видно форма слова меняется в зависимости от числа.
Таким образом нам нужна функция, которая бы склоняла слова, которые идут после числа.
Ниже я постарался написать универсальный вариант склонение слов после числительного.
/** * Word declension after a number. * * // Examples of invocation: * num_decline( $num, 'книга,книги,книг' ) * num_decline( $num, 'book,books' ) * num_decline( $num, [ 'книга','книги','книг' ] ) * num_decline( $num, [ 'book','books' ] ) * * @param int|string $number The number that is followed by the word. You can use HTML tags. * @param string|array $titles Variants of words for numbers. * @param bool $show_number Set to `false`, when you don't want to output the number itself. * * @return string For example: 1 book, 2 books, 10 books. * * @version 3.1 */ function num_decline( $number, $titles, $show_number = true ){ if( is_string( $titles ) ){ $titles = preg_split( '/, */', $titles ); } // когда указано 2 элемента if( empty( $titles[2] ) ){ $titles[2] = $titles[1]; } $cases = [ 2, 0, 1, 1, 1, 2 ]; $intnum = abs( (int) strip_tags( $number ) ); $title_index = ( $intnum % 100 > 4 && $intnum % 100 < 20 ) ? 2 : $cases[ min( $intnum % 10, 5 ) ]; return ( $show_number ? "$number " : '' ) . $titles[ $title_index ]; }
#1 Пример использования
Удобно, что параметры можно передавать по-разному. Чтобы каждый раз не вспоминать как именно нужно это делать, например:
echo num_decline( 4, 'книга, книги, книг' ); // 4 книги echo num_decline( 5, ['книга','книги','книг'] ); // 5 книг echo num_decline( 4, 'книга, книги, книг', 0 ); // книги
#1 Выведем склоняемый текст до и после числа
$num = 23; echo sprintf( "%s $num %s", num_decline( $num, 'Опубликован,Опубликовано', 0 ), num_decline( $num, 'комментарий,комментария,комментариев', 0 ) ); // Опубликовано 23 комментария
Функция склонения слов после чисел (JS)
Та же самая функция только для JS.
/** * Склонение слова после числа. * * // Примеры вызова: * num_decline( num, 'книга,книги,книг' ) * num_decline( num, 'book,books' ) * num_decline( num, [ 'книга','книги','книг' ] ) * num_decline( num, [ 'book','books' ] ) * * @param {int|string} number Число после которого будет слово. Можно указать число в HTML тегах. * @param {string|array} titles Варианты склонения или первое слово для кратного 1. * @param {boolean} show_number Указываем тут 00, когда не нужно выводить само число. * * @return string Например: 1 книга, 2 книги, 10 книг. * * @version 3.1 */ function num_decline( number, titles, show_number = true ){ if( typeof titles === 'string' ){ titles = titles.split( /, */ ) } // когда указано 2 элемента if( typeof titles[2] === 'undefined' ){ titles[2] = titles[1] } const cases = [ 2, 0, 1, 1, 1, 2 ] // strip_tags const intnum = Math.abs( parseInt( `${number}`.replace(/<\/?[^>]+>/gi, '') ) ) let title_index = ( intnum % 100 > 4 && intnum % 100 < 20 ) ? 2 : cases[ Math.min( intnum % 10, 5 ) ]; return ( show_number ? `${number} ` : '' ) + titles[ title_index ]; }
Более короткий вариант:
function numDecline( n, titles ) { return titles[ 1 === n % 10 && 11 !== n % 100 ? 0 : 2 <= n % 10 && 4 >= n % 10 && ( 10 > n % 100 || 20 <= n % 100 ) ? 1 : 2 ] } // использование numDecline( 1, ['книга', 'книги', 'книг'] )
Как получить список файлов внутри папки (включая подпапки) на PHP
Build In PostГотовая PHP-функция, которая получает список всех файлов, находящихся в заданной папке. Также по умолчанию включаются файлы находящиеся во вложенных папках: параметр $recursive = true.
Результатом работы функции является массив со списком всех файлов (и папок если $include_folders = true).
/** * Получает пути всех файлов и папок в указанной папке. * * @param string $dir Путь до папки (на конце со слэшем или без). * @param bool $recursive Включить вложенные папки или нет? * @param bool $include_folders Включить ли в список пути на папки? * * @return array Вернет массив путей до файлов/папок. */ function get_dir_files( $dir, $recursive = true, $include_folders = false ){ if( ! is_dir($dir) ) return array(); $files = array(); $dir = rtrim( $dir, '/\\' ); // удалим слэш на конце foreach( glob( "$dir/{,.}[!.,!..]*", GLOB_BRACE ) as $file ){ if( is_dir( $file ) ){ if( $include_folders ) $files[] = $file; if( $recursive ) $files = array_merge( $files, call_user_func( __FUNCTION__, $file, $recursive, $include_folders ) ); } else $files[] = $file; } return $files; }
Использование:
$files = get_dir_files('/home/example.com/wp-includes/'); /* Array ( [0] => /home/example.com/wp-includes/ms-settings.php [1] => /home/example.com/wp-includes/embed.php [2] => /home/example.com/wp-includes/rest-api.php [3] => /home/example.com/wp-includes/registration.php [4] => /home/example.com/wp-includes/cron.php ... */
Старый вариант
/** * Получает пути всех файлов в указанной папке, включая все вложенные уровни. * * @param $dir Путь до папки со слэшем на конце или без. * @return Вернет массив путей до файлов. */ function get_dir_files( $dir ){ $filenames = array(); $dir = rtrim( $dir, '/' ); // удалим слэш на конце if( is_dir($dir) ){ if( $handle = opendir($dir) ){ chdir( $dir ); while( false !== ($file = readdir($handle)) ){ if( $file != "." && $file != '..' ){ if( is_dir($file) ){ $arr = get_dir_files( $file ); foreach( $arr as $value ) $filenames[] = $dir .'/'. $value; } else { $filenames[] = $dir .'/'. $file; } } } chdir('../'); } closedir( $handle ); } return $filenames; } $files = get_dir_files('/home/example.com/wp-includes/'); /* Array ( [0] => /home/example.com/wp-includes/ms-settings.php [1] => /home/example.com/wp-includes/embed.php [2] => /home/example.com/wp-includes/rest-api.php [3] => /home/example.com/wp-includes/registration.php [4] => /home/example.com/wp-includes/cron.php ... */
Удаление папки (директории)
Build In PostЭтот код полностью удаляет указанную папку, т.е. удаляется папка и все вложенные в нее папки и файлы, включая скрытые файлы (.extension). Для этого добавьте следующую PHP функцию и используйте её где нужно.
/** * Удаляет текущую директорию и все файлы и папки в ней, включая скрытые файлы (.extension)... * @param string $folder_path Путь до папки которую нужно удалить */ function delete_folder( $folder_path, $delete_self = true ){ $folder_path = untrailingslashit( $folder_path ); $glod = glob( "$folder_path/{,.}[!.,!..]*", GLOB_BRACE ); foreach( $glod as $file ){ if( is_dir($file) ) call_user_func( __FUNCTION__, $file ); else unlink( $file ); } if( $delete_self ){ rmdir( $folder_path ); } }
Поиск файла в папке и подпапках на PHP
Build In PostХорошим примером использования рекурсии, может послужить поиск файла в папке и всем вложенным подпапкам.
Для поиска файла, достаточно перебрать все файлы во всех папках и сравнить название файла с искомым. И в случае совпадения добавить путь до файла в массив найденных фалов.
$folderName = ABSPATH; // в какой папке ищем $fileName = "xml"; // что ищем $found = search_file( $folderName, $fileName ); print_r( $found ); /* Вернет: Array ( [0] => /home/example.com/xmlrpc.php [1] => /home/example.com/wp-includes/class-wp-xmlrpc-server.php [2] => /home/example.com/wp-includes/wlwmanifest.xml ) */ /** * Поиск файла по имени во всех папках и подпапках * @param string $folderName - пусть до папки * @param string $fileName - искомый файл * @return array Массив найденных файлов. */ function search_file( $folderName, $fileName ){ $found = array(); $folderName = rtrim( $folderName, '/' ); $dir = opendir( $folderName ); // открываем текущую папку // перебираем папку, пока есть файлы while( ($file = readdir($dir)) !== false ){ $file_path = "$folderName/$file"; if( $file == '.' || $file == '..' ) continue; // это файл проверяем имя if( is_file($file_path) ){ // если имя файла искомое, то вернем путь до него if( false !== strpos($file, $fileName) ) $found[] = $file_path; } // это папка, то рекурсивно вызываем search_file elseif( is_dir($file_path) ){ $res = search_file( $file_path, $fileName ); $found = array_merge( $found, $res ); } } closedir($dir); // закрываем папку return $found; }
Массовая замена текста в файлах с помощью PHP или поиск в них
Build In PostЭтот пример может быть полезен, при работе с большим количеством файлов.
Пример ниже покажет, как можно перебрать все файлы в заданной папке, а также во всех вложенных папках и заменить в них строку на строку.
Вместо замены, этот код можно взять за основу, когда нужно создать поиск по файлам в папке и подпапках.
$oldText = 'old text'; // что меняем $newText = 'new text'; // на что меняем $folderName = "./files"; // в какой папке меняем // запускаем функцию replace_txt( $folderName, $oldText, $newText ); /** * Функция замены текста во всех файлах папки * @param string $folderName - пусть до папки * @param string $oldText - искомый текст * @param string $newText - на что меняем текст */ function replace_txt( $folderName, $oldText, $newText ){ $dir = opendir( $folderName ); // открываем текущую папку // перебираем папку, пока есть файлы while( false !== ($file = readdir($dir)) ){ // если это не папка if( $file != '.' && $file != '..' ){ $file_path = "$folderName/$file"; // это файл if( is_file($file_path) ){ $file_content = file_get_contents( $file_path ); // получаем конетнт файла // для работы с файлами в кодировке windows-1251 //$file_content = iconv( "windows-1251", "utf-8", $file_content ); // делаем замену в тексте $file_content = str_replace( $oldText, $newText, $file_content ); // сохраняем изменения file_put_contents( $file_path, $file_content ); } // это папка, рекурсивно вызываем replace_txt() elseif( is_dir($file_path) ){ replace_txt( $file_path, $oldText, $newText ); } } } closedir( $dir ); // закрываем папку }
Работа с zip архивами в PHP: запаковка и распаковка файлов
Build In PostКогда необходимо программно запаковать файлы в zip архив, используйте модуль — ZipArchive, который установлен практически на всех серверах вместе с PHP.
Для работы с модулем, используется одноименный класс – ZipArchive.
Запаковка файлов в zip
Пример показывает как запаковать все папки, подпапки и файлы в них с помощью ZipArchive.
/** * Create zip archive from specified folder. * * @param $source * @param $destination * @param bool $include_sourse * * @return string * * @ver 0.1 (kama) */ function zip_folder( $source, $destination, $include_sourse = true ){ $source = str_replace( '\\', '/', rtrim( realpath( $source ), '/' ) ); if( ! file_exists( $source ) ) return 'Error: file not exists'; $zip = new ZipArchive(); if( ! $zip->open( $destination, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE ) ) return 'Error: ZipArchive not installed'; if( $include_sourse ) $zip->addEmptyDir( basename($source) ); if( is_file( $source ) ){ $zip->addFile( $source ); } elseif( is_dir( $source ) ){ foreach( new RecursiveIteratorIterator( new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST ) as $file_path => $file_obj ){ // Ignore . | .. folders if( preg_match('~/[.]{1,2}$~', $file_path) ) continue; $file_rel_path = str_replace( "$source/", '', $file_path ); if( $include_sourse ) $file_rel_path = basename($source) .'/'. $file_rel_path; if( is_dir( $file_path ) ){ $zip->addEmptyDir( $file_rel_path ); } elseif( is_file( $file_path ) ){ $zip->addFile( $file_path, $file_rel_path ); } } } $zip->close(); return 'Done'; }
Использвоание:
$source = __DIR__ . '/wp-content'; $destination = __DIR__ . '/_'. basename($source) .'-'. date( 'd-m-Y' ) . '.zip'; echo zip_folder( $source, $destination );
Распаковка файлов из zip
Теперь, пример распаковки zip архива с помощью ZipArchive.
function unzip_file( $file_path, $dest ){ $zip = new ZipArchive; if( ! is_dir($dest) ) return 'Нет папки, куда распаковывать...'; // открываем архив if( true === $zip->open($file_path) ) { $zip->extractTo( $dest ); $zip->close(); return true; } else return 'Произошла ошибка при распаковке архива'; } // использование $zipfile = 'test.zip'; // путь до файла архива $pathdir = 'test/'; // путь к папке, в которую будет распакован архив $done = unzip_file( $zipfile, $pathdir ); if( is_string($done) ){ echo 'Ошибка: '. $done; }
В WordPress для распаковки архивов есть специальные функция (работают только в админке) unzip_file()
Как перевести цвет из HEX в RGB и наоборот в PHP
Перевод цвета из HEX в RGB
## перевод цвета из HEX в RGB function hex_to_rgb( $color ){ // проверяем наличие # в начале, если есть, то отрезаем ее if ( $color[0] == '#' ) { $color = substr( $color, 1 ); } // разбираем строку на массив if ( strlen($color) == 6 ) { // если hex цвет в полной форме - 6 символов list( $red, $green, $blue ) = array( $color[0] . $color[1], $color[2] . $color[3], $color[4] . $color[5], ); } elseif ( strlen($cvet) == 3 ) { // если hex цвет в сокращенной форме - 3 символа list( $red, $green, $blue ) = array( $color[0]. $color[0], $color[1]. $color[1], $color[2]. $color[2], ); } else { return false; } // переводим шестнадцатеричные числа в десятичные $red = hexdec( $red ); $green = hexdec( $green ); $blue = hexdec( $blue ); return array( 'red' => $red, 'green' => $green, 'blue' => $blue, ); } // пример использования $colorHex = '#FFAA00' ; $result = hex_to_rgb( $colorHex ); print_r( $result ); /* Array ( [red] => 255 [green] => 170 [blue] => 0 ) */
Перевод цвета из RGB в HEX
## перевод цвета из RGB в HEX function rgb_to_hex( $color ) { $red = dechex( $color[0] ); $green = dechex( $color[1] ); $blue = dechex( $color[2] ); return "#$red$green$blue"; } // пример использования $colorRgb = array(125, 255, 0); $result = rgb_to_hex($colorRgb); echo $result; //> #7dff0