WordPress как на ладони
Очень Удобный и Быстрый Хостинг для сайтов на WordPress. Пользуюсь сам и вам рекомендую!

Полезные 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

Чтобы разбить строку на отдельные слова, можно использовать 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)

Не редко возникает необходимость вывода числа с подписью и в этом случае в русском языке окончание подписи будет зависеть от того какое число указано. Например, вывод количества дней: 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

Готовая 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
	...
*/

Удаление папки (директории)

Этот код полностью удаляет указанную папку, т.е. удаляется папка и все вложенные в нее папки и файлы, включая скрытые файлы (.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

Хорошим примером использования рекурсии, может послужить поиск файла в папке и всем вложенным подпапкам.

Для поиска файла, достаточно перебрать все файлы во всех папках и сравнить название файла с искомым. И в случае совпадения добавить путь до файла в массив найденных фалов.

$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 или поиск в них

Этот пример может быть полезен, при работе с большим количеством файлов.

Пример ниже покажет, как можно перебрать все файлы в заданной папке, а также во всех вложенных папках и заменить в них строку на строку.

Вместо замены, этот код можно взять за основу, когда нужно создать поиск по файлам в папке и подпапках.

$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: запаковка и распаковка файлов

Когда необходимо программно запаковать файлы в 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
6 комментариев
    Войти