Полезные функции РНР (1 пост)

1. Роман (18.02.2008 / 12:18)
В данной теме предлагаю выкладывать именно полезные куски кода, которые в последствии юзеры смогут просто скопировать и вставить в свои скрипты и не создавать повторяющихся тем, вопросы в которых уже не раз обсуждались на форуме.
Уважаемые пользователи!
Просим вас вставлять код исключительно с тегами [code]
Внимание! Вопросы в этой теме запрещены!

2. Роман (22.02.2008 / 16:41)
Функция сортировки файлов в директории по времени добавления:
<?php
function sort_files($dir)
{
    $d = dir($dir);
    while ($f = readdir($d)) {
        if ($f != '.' && $f != '..') {
            if (is_dir($dir . '/' . $f))
                $arr += sort_files($dir . '/' . $f);
            else {
                $t       = filemtime($dir . '/' . $f);
                $arr[$t] = $f;
            }
        }
    }
    close($d);
    krsort($arr);
    return $arr;
}
?>
Функция в результате выдаст массив с именами файлов в порядке "новые вверху".

3. Tony V (26.02.2008 / 13:54)
Функция вывода приветствия на сайте:
<?php
function greeting($_lang = "ru", $_offset = "")
{
    $lang = array(
        'ru' => array(
            'morning' => 'Доброе утро!',
            'afternoon' => 'Добрый день!',
            'evening' => 'Добрый вечер!',
            'night' => 'Доброй ночи!'
        ),
        'en' => array(
            'morning' => 'Good morning!',
            'afternoon' => 'Good afternoon!',
            'evening' => 'Good evening!',
            'night' => 'Good night!'
        )
    );
    
    if (empty($_offset)) {
        // Если время на Вашем сервере отличается от Вашего, поменяйте сдвиг в переменной $offset 
        $_offset = 0;
    }
    if (empty($_lang)) {
        // язык по умолчанию 
        $_lang = 'ru';
    }
    
    // $curr_hour = текущий час 
    $curr_hour = date('G', time() + (60 * 60 * $_offset));
    
    if ($curr_hour >= "5" && $curr_hour <= "11") {
        // если текущий час больше 5 и менее 11 
        return $lang[$_lang]['morning'];
    } elseif ($curr_hour >= "12" && $curr_hour <= "17") {
        // если текущий час больше 12 и менее 17 
        return $lang[$_lang]['afternoon'];
    } elseif ($curr_hour >= "18" && $curr_hour <= "20") {
        // если текущий час больше 18 и менее 20 
        return $lang[$_lang]['evening'];
    } else {
        // все другие случаи 
        return $lang[$_lang]['night'];
    }
}
?>
<?php
// Выводим результат
echo greeting();
?>


4. Tony V (03.03.2008 / 11:18)
Функция показа расширения файла заданного в параметре
<?php
function pathinfo_utf($path, $options="") { 
	if(strpos($path, '/') !== false){
		$basename = end(explode('/', $path));
	}elseif(strpos($path, '\\') !== false){
		$basename = end(explode('\\', $path));
	}else{
		return(false);
	}
	if(empty($basename))	{
		return(false);
	}

	$dirname = substr($path, 0, strlen($path) - strlen($basename) - 1);

	if (strpos($basename, '.') !== false)
	{
		$extension = end(explode('.', $path));
		$filename = substr($basename, 0, strlen($basename) - strlen($extension) - 1);
	}
	else
	{
		$extension = '';
		$filename = $basename;
	}
	
	switch($options){
		case PATHINFO_DIRNAME:
			return($dirname);
		break;
		case PATHINFO_BASENAME:
			return($basename);
		break;
		case PATHINFO_EXTENSION:
			return($extension);
		break;
		case PATHINFO_FILENAME:
			return($filename);
		break;
		default:
			return(
				array(
					'dirname' => $dirname,
					'basename' => $basename,
					'extension' => $extension,
					'filename' => $filename
			));
		break;
	}
}

function extension($file){
	if(function_exists('pathinfo_utf')){
		$ext = pathinfo_utf($file, PATHINFO_EXTENSION);
	}else{	
		$ext = pathinfo($file, PATHINFO_EXTENSION);
	}
	$ext = strtolower($ext);
	return($ext);
}
?>
Пример работы:
<?php
$fileext=extension("file.exe"); // $fileext равно exe
$fileext=extension("FILE.sub.ExE"); // $fileext равно exe
?>


5. Павел (13.03.2008 / 18:34)
Функция вывода случайного пароля

<?php
function genPass($size)
{
$letter = 'qwertyuipasdfghjklzxcvbnm';
$letter .= strtoupper($letter);
$letter .= '123456789';
	
mt_srand((double)microtime()*1000000);
$pass = "";
for ($i = 0; $i < $size; $i++)
$pass .= $letter[mt_rand(0, strlen($letter)-1)];
return $pass;
}
?>


6. Удаленный (15.05.2008 / 17:06)
<?php
/* рекурсивная функция спускается по каталогу
   и переименовывает файлы с расширениемя из $ext_arr по маске 001.расширение ..
   писал по просьбе знакомого,может кому пригодится )
*/
function my_rename($dirname)
{
    $ext_arr = array('jpeg', 'jpg', 'gif');
    $dir = opendir($dirname);
    $count = 1;
    while (($file = readdir($dir)) !== false) {
        if (is_file($dirname . '/' . $file)) {
            $info = pathinfo($dirname . '/' . $file);
            if (in_array(strtolower($info['extension']), $ext_arr)) {
                rename($dirname . '/' . $file, $dirname . '/' . str_pad($count, 3, '0', STR_PAD_LEFT) . '.' . strtolower($info['extension']));
                $count ++ ;
            }
        } elseif (is_dir($dirname . '/' . $file) && $file != '.' && $file != '..')my_rename($dirname . '/' . $file);
    }
    closedir($dir);
}
# пример использования
$dir = 'papka';
my_rename($dir);
?>


7. Удаленный (28.03.2009 / 20:02)
получение русск языч варианта окончания new
<?php
/**
* @desc Функция получения русскоязычного варианта окончания для переданного числа
* @param float $value Число, для которого надо подобрать окончание
* @param array $names Массив имён вида [0]имя одного; [1]имя от 2 до 4; [2]имя 0 и от 5 до 20
* @return string Возвращает соответствующее числу слово
*/
function getNumberWord($value,$names){
    $temp = strval($value);
    $temp = $temp[strlen($temp)-1];
    return (($temp>1 and $temp <5 and (intval($value)>19 or intval($value)<10))?$names[1]:($temp==1?$names[0]:$names[2]));
}
 
// Пример работы
$old = '21;
echo 'Мне '.$old.' '.getNumberWord($old,array("год","года","лет"));
 
?>


8. Удаленный (28.03.2009 / 20:05)
ф-ия проверки пароля на безопастность
/*
Задача:
Написать функцию проверки пароля на безопасность
 * длина не меньше 6 символов
 * должен содержать и символы и числа
 * не должен содержать больше (>=) 3 линейно расположенных на клавиатуре символов или цифр, например таких как "lkj" или "cvb"
 * если пароль безопасен — вернуть истину, нет — ложь
*/
 
function isGood ($pass)
{
    $kbStrings = array('1234567890','qwertyuiop','asdfghjkl','zxcvbnm',
                       '0987654321','poiuytrewq','lkjhgfdsa','mnbvcxz');
    $isGood = false;
    if (strlen($pass) >= 6) {
        if (preg_match('/[a-z]/i',$pass) && preg_match('/[0-9]/',$pass)) {
            $count = strlen($pass) - 2;
                        $isGood = true;
                    } else {
                        $isGood = false;
                        break 2;
                    }
                }
            }
        }
    }
    return $isGood;
}


9. Артур (23.11.2009 / 19:12)
<?php
class Smiles
{
private $data = array();
private $pack = 'default';
public function __construct($pack)
{
$q = mysql_query('SELECT `name`, `file` FROM `smiles` WHERE `pack` = "'.$pack.'"');
while($i = mysql_fetch_assoc($q))
$this->data[$i['name']] = $i['file'];
$this->pack = $pack;
}
public function replace($text)
{
foreach($this->data as $key=>$val)
$text = str_replace($key, '<img src="/smiles/'.$this->pack.'/'.$val.'"/>', $text);
return $text;
}
}
Это пародия на предыдущую ф-ю, только на ООП. Не тестил, не знаю будет ли работать но вроде всё правильно smile если что - по голове сильно не бить
Таблица с полями name, file, pack
name - смайл
file - путь к смайлу, аля smile.png
pack - пак смайлов.
Использование
$smiles = new Smiles($smilepack);
$text = $smiles->replace($text);

10. Titov (29.12.2009 / 01:31)
Ф-я удаления файлов через определенное время из директории
<?
function old($papka,$times){ 
$old_time = time()-60*$times;
$dir = opendir ($papka); 
while ($file = readdir ($dir)) { 
if (( $file != ".") && ($file != ".."))
$files[]="$papka/$file"; 
$time[]=filemtime("$papka/$file" );
} 
closedir ($dir); 
$count_files = count($files); 
for($i = 1; $i< $count_files; $i++){   
if($time[$i] <= $old_time){
@unlink($files[$i]);
}
}
}
?>
далее
<?
old('papka',30);//// будет удалять файлы которые лежат на севрере больше 30 минут, papka наша директория с файлами 
?>
проверял вроде все правильно теперь, можно использовать например для чистки кеша на сайте автоматически или удалять какието временные файлы которые через некоторое время не нужны на сервере.

11. chiper (30.12.2009 / 23:04)
Функция считает размер базы данных
<?php
function formatfilesize( $data ) {
if( $data < 1024 ) {
return $data . " bytes";
}else if( $data < 1024000 ) {
return round( ( $data / 1024 ), 1 ) . " KB";
}
else {
return round( ( $data / 1024000 ), 1 ) . " MB";}    
}
$db = mysql_connect ("localhost","user","pass");
mysql_select_db("dbname",$db);
$result = mysql_query( "SHOW TABLE STATUS" );
$dbsize = 0;
while( $row = mysql_fetch_array( $result ) ) {  
$dbsize += $row[ "Data_length" ] + $row[ "Index_length" ];
}
echo "Размер базы данных составляет " . formatfilesize( $dbsize );
?>


12. Удаленный (06.02.2010 / 06:58)
Функция изменяет размер изображения,
<?php
%40return boolean */
     function img_resize($src, $out, $width, $height, $color = 0xFFFFFF, $quality = 100) 
     {
    // Если файл не существует
    if (!file_exists($src)) {
        return false;  
    }
    $size = getimagesize($src);
    $format = strtolower(substr($size['mime'], strpos($size['mime'], '/') + 1));
    $picfunc = 'imagecreatefrom'.$format;
    $gor = $width  / $size[0];
    // Вертикальное соотношение
    $ver = $height / $size[1];  
    // Если не задана высота, вычислить изходя из ширины, пропорционально
    if ($height == 0) {
        $ver = $gor;
        $height  = $ver * $size[1];
    }
	// Так же если не задана ширина
	elseif ($width == 0) {
        $gor = $ver;
        $width   = $gor * $size[0];}
    // Формируем размер изображения
    $ratio   = min($gor, $ver);
    // Нужно ли пропорциональное преобразование
    if ($gor == $ratio)
        $use_gor = true;
    else
        $use_gor = false
    $new_width   = $use_gor  ? $width  : floor($size[0] * $ratio);
    $new_height  = !$use_gor ? $height : floor($size[1] * $ratio);
    $new_left    = $use_gor  ? 0 : floor(($width - $new_width)   / 2);
    $new_top     = !$use_gor ? 0 : floor(($height - $new_height) / 2);
    $picsrc  = $picfunc($src);
    // Создание изображения в памяти
    $picout = imagecreatetruecolor($width, $height);
     // Заполнение цветом
    imagefill($picout, 0, 0, $color);
    // Нанесение старого на новое
    imagecopyresampled($picout, $picsrc, $new_left, $new_top, 0, 0, $new_width, $new_height, $size[0], $size[1]);
    // Создание файла изображения
    imagejpeg($picout, $out, $quality); 
	// Очистка памяти
    imagedestroy($picsrc);
    imagedestroy($picout);
    return true;
}
?>


13. Azzido (13.04.2010 / 13:18)
Тема существует давно, я вот сейчас все перечитал и заметил что посты некоторые перепутаны номерами, например писал функцию сжатия в четыре поста и эти посты раскиданы теперь друг от друга.
Вот еще несколько полезных функций.
Вставляем новые данные на 5 строку, а саму 5 строку передвигаем на 6:
<?php
$file='base.txt';//файл, в которой добавляем нужную нам строку
$line=5;//строка, на которую вставляем новые данные
$data='новая строка';//данные новой строки
$array=file($file);
$open=fopen($file,'w');
while(list($num,$string)=each($array))
{
if(($num+1)==$line) fwrite($open,$data."\r\n");
fwrite($open,$string);
}
fclose($open);
?>


14. Azzido (13.04.2010 / 13:31)
Определяем в какой стране живёт посетитель:
<?php
$host=gethostbyaddr($_SERVER['REMOTE_ADDR']);
$countrys=array(
ru => Россия,
ua => Украина,
kz => Казахстан
);
$array=array_reverse(explode('.',$host));
if(isset($countrys[$array[0]])){
echo 'Ваша страна: '.$countrys[$array[0]];
}else{
echo 'Откуда Вы пришли - я не знаю :( ';
?>


15. Tony V (30.04.2010 / 03:00)
Быстрое меню для навигации по сайту
В современных браузерах редирект происходит автоматически после того, как выбран элемент.
В браузерах не поддерживающих JS будет показываться кнопка для выбора.
<?php
// Если переменная gotourl не пуста, перенаправляем
if(!empty($_REQUEST['gotourl'])){
	// Если заголовки уже отправлены, выводим ссылку
	if(headers_sent() == FALSE){
		// Выдаём заголовки, указывающие браузеру о перенаправлении на другую страницу
		header('HTTP/1.1 301 Moved Permanently');
		header('Location: '.$_REQUEST['gotourl']);
	}
	// Выходим
    exit('Переход на сайт <a href="'.urlencode($_REQUEST['gotourl']).'">'.$_REQUEST['gotourl'].'</a>');
}else{
// Ну а если пуста, выводим список ссылок
?>
<form action="redirect.php" method="GET">
    <select name="gotourl" size="1" onChange="this.form.submit();">
        <option value="" disabled="disabled" selected="selected">Куда прикажете отправиться?</option>
        <option value="http://visavi.net/">visavi.net</option>
        <option value="http://m.habrahabr.ru/">habrahabr.ru</option>
        <option value="http://bighack.net/">bighack.net</option>
        <option value="http://fakoymozg.ru/">fakoymozg.ru</option>
		<option value="http://ссылка/">название</option>
    </select>
    <noscript>
        <input type="submit" value="Выбрать" />
    </noscript>
</form>
<?php
}
?>
P.S. Скрипт сохраните как redirect.php и подключайте через include

16. smartvbxos7 (14.06.2010 / 01:20)
<?php

// Преобразователь из цельсия в фарингейт и обратно, SmartMan.

class convert {

private $degree;

public function __construct($degree) {
$this->degree = $degree;
}

public function c2f(){
return ($this->degree * 1.8) + 32;
}

public function f2c(){
return ($this->degree - 32) / 1.8;
}
}

// Из цельсия в фарингейт
$c2f = new convert(100);
echo $c2f->c2f().'<br />'; // 212

// Из фарингейта в цельсий
$f2c = new convert(212);
echo $f2c->f2c(); // 100

?>


17. iNeeXT (14.07.2010 / 14:52)
 
<?php 
//Вот функция для получения ip адреса даже если пользователь использует прокси сервер
function getip() { 
if(getenv("HTTP_CLIENT_IP")) { 
$ip = getenv("HTTP_CLIENT_IP"); 
} elseif(getenv("HTTP_X_FORWARDED_FOR")) { 
$ip = getenv("HTTP_X_FORWARDED_FOR"); 
} else { 
$ip = getenv("REMOTE_ADDR"); 
} 
$ip = htmlspecialchars(substr($ip,0,15), ENT_QUOTES); 
return $ip; 
} 
?>


18. iNeeXT (14.07.2010 / 14:55)
<?php
//проверка есть ли сайт в яндексе
//by Signum
function in_ya($who) 
{ 
$text=file_get_contents('http://yandex.ru/yandsearch?text='.$who); $url=explode('.',$who); 
if(preg_match('/<b>'.$url[0].'<\/b>.<b>'.$url[1].'<\/b>/i', $text)) 
return 'Сайт '.$who.' есть в яндексе'; 
else 
return 'Сайтa '.$who.' нет в яндексе'; 
} 
//Юзать так: 
//echo in_ya('visavi.net'); 
?>


19. Azzido (14.07.2010 / 15:36)
Функция определения ip-адреса:
<?php
if(isset($_SERVER['HTTP_X_FORWARDED_FOR']) and filter_var(strtok(@$_SERVER['HTTP_X_FORWARDED_FOR'],','),FILTER_VALIDATE_IP,FILTER_FLAG_IPV4)!==FALSE){
$ip=strtok($_SERVER['HTTP_X_FORWARDED_FOR'],',');
}
elseif(isset($_SERVER['GEOIP_ADDR']) and filter_var(@$_SERVER['GEOIP_ADDR'],FILTER_VALIDATE_IP,FILTER_FLAG_IPV4)!==FALSE){
$ip=$_SERVER['GEOIP_ADDR'];
}
elseif(isset($_SERVER['HTTP_X_REAL_IP']) and filter_var(@$_SERVER['HTTP_X_REAL_IP'],FILTER_VALIDATE_IP,FILTER_FLAG_IPV4)!==FALSE){
$ip=$_SERVER['HTTP_X_REAL_IP'];
}
elseif(isset($_SERVER['HTTP_CLIENT_IP']) and filter_var(@$_SERVER['HTTP_CLIENT_IP'],FILTER_VALIDATE_IP,FILTER_FLAG_IPV4)!==FALSE){
$ip=$_SERVER['HTTP_CLIENT_IP'];
}
elseif(isset($_SERVER['REMOTE_ADDR']) and filter_var(@$_SERVER['REMOTE_ADDR'],FILTER_VALIDATE_IP,FILTER_FLAG_IPV4)!==FALSE){
$ip=$_SERVER['REMOTE_ADDR'];
}else{
$ip='0.0.0.0';
}
?>


20. Neformat (18.07.2010 / 12:00)
<?php
// получаем продолжительность и размеры видео (используем ffmpeg)
 
$movie = new ffmpeg_movie("/www/1.avi");
echo "Продолжительность фильма:  ";
// так как  мы получаем секунды надо нам их перевести в человечный вид ЧЧ:ММ:CC
// для этого мы и используем функцию  gmdate  я думаю фильмов длиной по несколько дней у вас нет =)
echo "<b>".gmdate("H:i:s",$movie->getDuration())."</b><br />"; 
 
// теперь выведем размерв нашего фильма
echo "Размеры фильма:  ";
echo "<b>".$movie->getFrameWidth()." x ".$movie->getFrameHeight()."</b>"; 
 
?>


21. Neformat (18.07.2010 / 12:02)
<?php 
//получаем скриншот с видео (используем ffmpeg) 
  
// путь до файла 
$file = "/www/1.avi"; 
// кадр который будем выхватывать 
$frame = 150;  
  
// получаем кадр 
$movie = new ffmpeg_movie($file); 
$image = $movie->getFrame($frame); 
$show_img = $image->toGDImage();  
  
// выводим его 
header("Content-type: image/jpeg"); 
imagejpeg($show_img); 
imagedestroy($show_img); 
?>


22. Neformat (18.07.2010 / 12:03)
<?php
// получаем скриншот и уменьшаем его (используем ffmpeg) 
 
// путь до файла
$file = "/www/1.avi";
// кадр который будем выхватывать
$frame = 150;
// максимальный размер по высоте 
$max_width  = 150; 
 
// получаем кадр в gd
$movie = new ffmpeg_movie($file);
$image = $movie->getFrame($frame);
$show_img = $image->toGDImage(); 
 
// редактируем то что в gd
$new_image = new ffmpeg_frame($show_img);
//вычисляем старые значения ширины и высоты
$old_width = $new_image->getWidth();
$old_heighgt = $new_image->getHeight();
// соотношение сторон
$mov_ratio = $old_width/$old_heighgt;
if($old_width > $max_width){
    $new_width    = $max_width;
 }
// задаём новые параметры
$new_height = $new_width / $mov_ratio;
// изменяем размер
$new_image->resize($new_width, $new_height);
$new_show_img = $new_image->toGDImage(); 
 
// выводим его
header("Content-type: image/jpeg");
imagejpeg($new_show_img);
imagedestroy($new_show_img); 
?>


23. Neformat (18.07.2010 / 12:04)
<?php
// создаём анимированый .gif (используем ffmpeg) 
// путь до файла
$file = "/www/1.avi"; 
 
// поехали =)
$movie = new ffmpeg_movie($file); 
 
// создаём анимацию
$gif=new ffmpeg_animated_gif("/www/primer.gif",100 ,100 ,24); 
 
for ($frame = 150; $frame <= 200; $frame++) {
    $image = $movie->getFrame($frame);
    $gif->addFrame($image);
} 
?>


24. chiper (21.07.2010 / 12:53)
Регуляртное выражение проверки E-mail адресов

<?php
$mail = 'ChipeR@s60-club.net';

if (!preg_match('/^[a-zA-Z0-9-._]{3,25}@[a-zA-Z0-9-]{2,25}.[a-zA-Z]{2,4}$/',$mail)){

   echo '<b><font color=red>Формат не верный!</font></b>';

}else{

   echo '<b><font color=green>Формат верный!</font></b>';
   
}

Регуляртное выражение для создания BB кода ICQ

<?php
$text = '[icq:7017970]';

echo preg_replace('#\[icq:( .*?[0-9]{5,9})\]#si','<img src="http://web.icq.com/whritepages/online?icq=\1&amp;img=5" alt="ICQ" />ICQ: \1',$text);
?>


25. KOZZ (28.07.2010 / 08:18)
Функция замены строк в файле. Делал для себя,решил поделиться со всеми:
<?
function replace($from,$to,$str,$file) {
# $from - заменяемый текст
# $to - текст на который заменяем
# $str - строка в которой производим замену ('all - все строки')
# $file - файл в котором производим замену
if(!file_exists($file)){die("Файл '$file' не существует!");}

$f1 = htmlspecialchars(file_get_contents($file));
if($str!=='all'){
$str = $str-1;
$f_str = explode("\n",$f1);
$f2 = str_replace($from,$to,$f_str[$str]);
$f3 = str_replace($f_str[$str],$f2,$f1);
$result = $f3;
}else{
$f1 = htmlspecialchars(file_get_contents($file));
$f2 = str_replace($from,$to,$f1);
$result = $f2;
}
if(file_put_contents($file,$result))
{die ('Замена произведена успешно!');} else {die ('Ошибка замены!');}
}
# Пример использования:
$ex = explode('|',file_get_contents('1.dat'));
replace($ex[0],'yeah','all','1.dat');
# или так:
replace($ex[0],'yeah',7,'1.dat');

?>


26. ramzes (28.07.2010 / 08:33)
че то жестокое ты изобразил
<?php
function replace_string($file, $line, $new, $old=''){
$text = file($file);
$text[$line] = ($old!='') ? str_replace($old, $new, $text[$line]) : $new."\r\n";
$ff = fopen($file, 'w');
fwrite($ff. implode('', $text));
fclose($ff);
}
?>


27. Arab (28.07.2010 / 12:10)
хосты и хиты на файлах с проверкой на куки.
<?php

# Если гость впервые на сайте
if(empty($_COOKIE['day'])){
SetCookie("day",date('d'),time()+3600*24*350);
$static = file("statistic.dat");
$ud = explode("|",$static[0]);
$udnew = $ud[0]+1;
$udnew2 = $ud[1]+1;
if($ud[2]!=date('d')){ $udnew2=1; }

$newst = $udnew.'|'.$udnew2.'|'.date('d');

$fop = fopen("statistic.dat", "r+");
fputs($fop,$newst);
fclose($fop); }

#Eсли гость и раньше бывал на сайте
if(!empty($_COOKIE['day']) && $_COOKIE['day']!=date('d')){
SetCookie("day",date('d'),time()+3600*24*350);

$static = file("statistic.dat");
$ud = explode("|",$static[0]);
$udnew = $ud[1]+1;
if($ud[2]!=date('d')){ $udnew=1; }

$newst = $ud[0].'|'.$udnew.'|'.date('d');

$fop = fopen("statistic.dat", "r+");
fputs($fop,$newst);
fclose($fop); } 
чтоб код работал создаем файл static.dat с содержанием 0|0|0
и выводим

$static = file("statistic.dat");
$ud = explode("|",$static[0]);
echo'Гостей сегодня: '.$ud[1].'<br>
Гостей за все время: '.$ud[0];

28. iNeeXT (30.07.2010 / 21:37)
<?php
set_time_limit (0);
$excel = new COM("excel.application");
//Keep Excel invisible
$excel->Visible = 0;
//Create a new workbook
$wkb = $excel->Workbooks->Add();
$sheet = $wkb->Worksheets(1);
//This code adds the text 'Test' on row 2, column 4
$sheet->activate;
$files=array();
$a=1;
function recursedir($BASEDIR)
{
global $files;
$ext = array("html");
$files = array();
$hndl=opendir($BASEDIR);
while($file=readdir($hndl))
{

for($i=0;$i if(strstr($file, ".".$ext[$i])) $files[]=$file;
}
return $files;
}

// задаём директорию с которую нужно парсить
$BASEDIR="/1/";

recursedir($BASEDIR);

foreach($files as $file){
$fp = file_get_contents($BASEDIR.$file);
$fp=str_replace("**","\n \n",$fp);
$cell = $sheet->Cells($a,1);
$cell->Activate;
$cell->value =$fp ;
$a++;
}

$wkb->SaveAs("C:\excel123.xls");
//Quit MS Excel
$wkb->Close(false);
$excel->Workbooks->Close();
$excel->Quit();
unset($sheet);
unset($excel);
?>
PHP+Excel быстро генерируем XLS файлы

29. KOZZ (31.07.2010 / 16:06)
минималистичный скрипт статистики)
записывает в файл реферер и к-во переходов (только если юзер пришел с других сайтов)
<? # запись реферера 
$date = date('d_m_y'); $stat_f = "ref/$date.dat"; 
 if(!file_exists($stat_f)){
file_pu t_contents ($stat_f,"Сайт | Переходов|");
} 
$ref_f = file($stat_f); 
$ref_f_str = implode('',$ref_f);
foreach($ref_f as $str){
if(!empty($str)){list($ref_ site [],$ref_kol[]) = explode('|',$str);}}
if(!empty($_SERVER['HTTP_REFER ER'])){  $refer = parse_url(
$_SERVER['HTTP_REF ERER']);
if(isset($refer['host']) && $refer['host']!==$_SERVER ['HTTP_HOST']) { if(preg_match('/(.+ )\.(.+ )\.(.{2 ,4 })/',$refer['host'])) {$refer['host'] = substr(strchr($refer ['host'],'.'),1);}
$searched = array_search($refer['host'],$re f_site);
if($searched == 0 ){
file_put_contents (
$stat_f,$ref_f_str."\n".$refer[ 'host'].'|1 |');
}else{
$ref_f[$searched] = $refer['host'].'|'.($ref_kol [$searched]+1)."|";
file_put_contents($stat_f,impl ode ('',$ref_f));} } } ?> 
принимаю любую критику

30. Azzido (10.08.2010 / 20:46)
Удаление невалидных символов XML (чаще всего для парсеров API)
<?php
function stripInvalidXml($value)
{
    $ret = "";
    $current;
    if (empty($value)) 
    {
        return $ret;
    }
 
    $length = strlen($value);
    for ($i=0; $i < $length; $i++)
    {
        $current = ord($value{$i});
        if (($current == 0x9) ||
            ($current == 0xA) ||
            ($current == 0xD) ||
            (($current >= 0x20) && ($current <= 0xD7FF)) ||
            (($current >= 0xE000) && ($current <= 0xFFFD)) ||
            (($current >= 0x10000) && ($current <= 0x10FFFF)))
        {
            $ret .= chr($current);
        }
        else
        {
            $ret .= " ";
        }
    }
    return $ret;
}


31. KOZZ (16.08.2010 / 23:09)
простенькая антиреклама
<?
function ad_cut($str,$to){
$domains = array('http://','.ru','.su','.mobi','.ws','.eu','.tv','.cc','.tv','.name','.us','.biz','.info','.org','.net','.com','.co','.in');
$replacer = array_fill(0,count($domains),$to);
$result = array_combine($domains,$replacer);
return strtr($str,$result);
}
?>


32. KOZZ (21.08.2010 / 00:30)
удаление строки из файла
<?
function delete_str($f_name,$num){

# $f_name - файл в котором удаляем строку
# $num - номер удаляемой строки

$f = file($f_name);

unset($f[$num]);

if($num == (count($f)-1) && $num !== 0)
{$f[$num-1] = str_replace("\r\n",'',$f[$num-1]);}

if(file_put_contents($f_name,implode('',$f)))
{return true;} else {return false;}
}
?>


33. KOZZ (21.08.2010 / 01:09)
47, поправочка:
<?
# удаление строки
function delete_str($f_name,$num){
$f = file($f_name);

unset($f[$num]);

if($num == count($f) && $num !== 0)
{$f[$num-1] = substr($f[$num-1],0,-2);}# убираем \r\n, если это последняя строка

if(file_put_contents($f_name,implode('',$f)))
{return true;} else {return false;}
}
?>


34. Владислав (22.08.2010 / 16:05)
Определение дизайна сайта в зависимости от браузера
Не функция ) регулярка
$style = (preg_match('#linux|windows|Yahoo|Rambler|Yandex|Google|bsd|bsd|unix|macos|macintosh#i', $_SERVER['HTTP_USER_AGENT'])) ? 'web' : 'wap';


35. Артём (23.08.2010 / 05:05)
Узнаем день недели из time();
function ned($time){
if (isset($time)){

   $d = date("l",time());

$time = str_replace(array('Sunday','Monday','Tuesday','Wednesday','Friday','Saturday') , array('Воскресенье','Понедельник','Вторник','Четверг','Пятница','Суббота'), $d);
         

   return $time; }else{ return false; }
 }
пример:
echo ned(time());


36. Санёк (23.08.2010 / 08:41)
Функция определения возраста по дате в формате 'dd.mm.yyyy'
function age($date)
 {
  $date=explode('.',$date);
  $m=date('m');
  $year=date('Y')-$date[2]-1;
  if ($m>$date[1])
   $year++;
  if ($m==$date[1])
   if (date('d')>=$date[0])
    $year++;
  return $year;
 }


37. Санёк (08.09.2010 / 21:52)
Не знаю на 100 % велосипед это или нет..
функция аналог imolode(), отлично от неё тем, что работает как с обычными так и многомерными массивами.
function my_implode($line,$array)
 {
  $end=count($array);
  $str='';
  for ($i=0; $i<$end; $i++)
   {
   	if ($i==0)
   	 $value=reset($array);
   	else
   	 $value=next($array);
   	if (is_array($value))
   	 $str.=my_implode($line,$value);
   	else
   	 $str.=$value;
   	if ($i<($end-1))
   	 $str.=$line;
   }
  return $str;
 }


38. Azzido (23.09.2010 / 07:13)
Вот из комментариев к функции implode на php.net
Recursive Implode 

<?php 

function r_implode($glue, $pieces) 
{ 
  foreach($pieces as $r_pieces) 
  { 
    if(is_array($r_pieces)) 
    { 
      $retVal[] = r_implode($glue, $r_pieces); 
    } 
    else 
    { 
      $retVal[] = $r_pieces; 
    } 
  } 
  return implode($glue, $retVal); 
} 

?>
Пример:
<?php
$test_arr = array(0, 1, array('a', 'b'), array(array('x', 'y'), 'z')); 
echo r_implode(',', $test_arr) . "\n"; 
$test_arr = array(0); 
echo r_implode(',', $test_arr) . "\n"; 
?>
Эта функция побыстрее будет работать немного, чем опубликованая выше.

39. iNeeXT (05.10.2010 / 23:24)
CSV/TSV-формат и PHP
<?
$rows = tsv_array($this->data['ModelName']['textarea_field']);   
?>
и
<?
function tsv_array($s, $keys=false, $delimiter="\t") {   
    $rows = explode("\n", r("\r", '', trim($s)));   
    $min = null;   
    $max = null;   
    foreach ($rows as &$row) {   
        $row = array_map('trim', explode($delimiter, $row));   
        $count = count($row);   
        if ($min===null || $count<$min) {   
            $min = $count;   
        }   
        if ($max===null || $count>$max) {   
            $max = $count;   
        }   
    }   
    unset($row);   
    if ($max!=$min) {   
        foreach ($rows as &$row) {   
            for ($i=count($row); $i<=$max; $i++) {   
                $row[] = false;   
            }   
        }   
        unset($row);   
    }   
    if (!$keys) return $rows;   
    if ($keys===true) {   
        $keys = array_shift($rows);   
    }   
    $result = a();   
    foreach ($rows as $row) {   
        $item = a();   
        for ($i=0; $i<count($row); $i++) {   
            if (!isset($keys[$i])) continue;   
            $item[$keys[$i]] = $row[$i];   
        }   
        $result[] = $item;   
    }   
    return $result;   
}  
?> 

Добавлено через 01:56 сек.
Преобразовать в верхний регистр первый символ строки
<?
function ucwords(string) {   
    return string.charAt(0).toUpperCase() + string.substr(1).toLowerCase();   
}  
klass

40. iNeeXT (05.10.2010 / 23:28)
Преобразование переводов строк
Метод преобразует переводы строк вне тэгов <pre> в тэги <br />. Данная функция идентична встроенной в PHP nl2br() за исключением того, что она игнорирует пробелы в тэгах <pre>.
<?
if ( ! function_exists('nl2br_except_pre'))   
{   
    function nl2br_except_pre($str)   
    {   
        $ex = explode("pre>",$str);   
        $ct = count($ex);   
       
        $newstr = "";   
        for ($i = 0; $i < $ct; $i  )   
        {   
            if (($i % 2) == 0)   
            {   
                $newstr .= nl2br($ex[$i]);   
            }   
            else   
            {   
                $newstr .= $ex[$i];   
            }   
           
            if ($ct - 1 != $i)   
                $newstr .= "pre>";   
        }   
       
        return $newstr;   
    }   
}  

Добавлено через 01:04 сек.
Функция преобразует XML-символы в их сущности

Принимает строку и преобразует в ней зарезервированные XML-символы в их сущности:

Амперсанд: &
Знаки больше и меньше: < >
Одинарная и двойная кавычки: ' "
Дефис: -

Эта функция игнорирует амперсанд, если он является частью существующих сущностей.


<?
if ( ! function_exists('xml_convert'))  
{  
    function xml_convert($str)  
    {  
        $temp = '__TEMP_AMPERSANDS__';  
  
        // Replace entities to temporary markers so that   
        // ampersands won't get messed up  
        $str = preg_replace("/&#(\d );/", "$temp\\1;", $str);  
        $str = preg_replace("/&(\w );/",  "$temp\\1;", $str);  
      
        $str = str_replace(array("&","<",">","\"", "'", "-"),  
                           array("&", "<", ">", """, "'", "-"),  
                           $str);  
  
        // Decode the temp markers back to entities       
        $str = preg_replace("/$temp(\d );/","&#\\1;",$str);  
        $str = preg_replace("/$temp(\w );/","&\\1;", $str);  
          
        return $str;  
    }  
}  


41. KOZZ (05.11.2010 / 21:50)
функция полезна тем кто использует файлы как таблицу для хранения информации (типа "Вася Пупкин|10 лет|город Москва|")
функция для замены отдельного блока информации в файле
(например заменить блок "город Москва" на "поселок Эльбан")
пример использования:
explode_replace('|',0,'поселок Эльбан',1,'file.txt');

<?
function explode_replace($exploder,$ex_num,$to,$str_num,$file){

# $exploder - разделитель
# $ex_num - номер заменяемого блока (отсчет с 0)
# $to - на что заменяем
# $str_num - номер строки в которой производим замену (отсчет с 0)
# $file - файл в котором производим замену

$a = file($file);

$ex = explode($exploder,$a[$str_num]);
$ex[$ex_num] = $to;
$a[$str_num] = implode($exploder,$ex);

if(file_put_contents($file,$a)){return true;} else {return false;}
}
?>


42. 4Design (10.11.2010 / 13:05)
Склоняем русские слова

function russian_text($koll = 0, $words = 0) {
    if ($koll < 11 or $koll > 19) {
        $koll = (string )$koll;
        switch ($koll{mb_strlen($koll) - 1}) {
            case 1:
                return ($words[0]);
                break;
            case 2:
            case 3:
            case 4:
                return ($words[1]);
                break;
            default:
                return ($words[2]);
                break;
        }
    }
    else
        return ($words[2]);
}


43. Владислав (15.11.2010 / 17:51)
/**
* Функция рекурсивного подсчета файлов в папке
*/
function filedircount($dir)
{
	$count = 0;
   	if ($objs = glob($dir."/*")) {
		foreach($objs as $obj) {
	 		if(is_dir($obj)) {
				$count += filedircount($obj);
			} else {
				++$count;
			}
		}
   }
   return $count;
}


44. Евгений (15.11.2010 / 21:12)
функции для проверки, начинается/заканчивается ли строка подстрокой (аналог startsWith/endsWith в Java)

function startsWith($haystack, $needle, $case=true) {
    if ($case)
        return strncmp($haystack, $needle, strlen($needle)) == 0;
    else
        return strncasecmp($haystack, $needle, strlen($needle)) == 0;
}

function endsWith($haystack, $needle, $case=true) {
     return startsWith(strrev($haystack),strrev($needle),$case);
}


45. Lugaro (25.11.2010 / 17:13)
<? 
/*Зебра с неограниченным количеством дивов 
Указываем список дивов и функция выводит их по очереди*/
function zebra(){
	static $divs;
	if(!isset($divs) || $divs != func_get_args()) $divs = func_get_args();
	$div = current($divs);
	if(next($divs) === false) reset($divs);
	return $div;
}

//Пример:
for ($i=0; $i<10; $i++) {
	$div = zebra('zebra1', 'zebra2');
	echo '<div class="'.$div.'">'.$div.'</div>';
}


46. KOZZ (30.11.2010 / 19:53)
<?
// Функция для того, чтобы иЗyPoДоВаТь текст
$str = 'бросайте вы корявить текст';

function koryavka ($t){
$c = strlen($t);

for($i=0;$i<$c;$i++) {
$t[$i] = (is_int($i/2)) ? strtoupper($t[$i]) : $t[$i];
$ret[] = $t[$i];
}

return implode('',$ret);
}

echo koryavka ($str);
?>

47. KOZZ (11.12.2010 / 07:41)
<?
# функция градиента текста (переливание цвета)
function gradient($text, $hexfrom, $hexto){

$text = iconv('utf-8','windows-1251',$text);
$colorsteps = strlen($text);

$fromrgb['r'] = hexdec(substr($hexfrom, 0, 2));
$fromrgb['g'] = hexdec(substr($hexfrom, 2, 2));
$fromrgb['b'] = hexdec(substr($hexfrom, 4, 2));
 
$torgb['r'] = hexdec(substr($hexto, 0, 2));
$torgb['g'] = hexdec(substr($hexto, 2, 2));
$torgb['b'] = hexdec(substr($hexto, 4, 2));
 
$steprgb['r'] = ($fromrgb['r'] - $torgb['r']) / ($colorsteps - 1);
$steprgb['g'] = ($fromrgb['g'] - $torgb['g']) / ($colorsteps - 1);
$steprgb['b'] = ($fromrgb['b'] - $torgb['b']) / ($colorsteps - 1);
 
for($i = 0; $i <= $colorsteps; $i++){

$rgb['r'] = floor($fromrgb['r'] - ($steprgb['r'] * $i));
$rgb['g'] = floor($fromrgb['g'] - ($steprgb['g'] * $i));
$rgb['b'] = floor($fromrgb['b'] - ($steprgb['b'] * $i));
 
$hexrgb['r'] = sprintf('%02x', ($rgb['r']));
$hexrgb['g'] = sprintf('%02x', ($rgb['g']));
$hexrgb['b'] = sprintf('%02x', ($rgb['b']));

$color = implode(null, $hexrgb);
 
$return .= '<font color="'.$color.'">'.$text[$i].'</font>';

}

return iconv('windows-1251','utf-8',$return);
}

echo gradient('Супер пупер текст в градиенте','000000', 'FF0000'); // пример использования
?>


48. Lugaro (24.12.2010 / 08:00)
Наткнулся в одном блоге на неплохую функцию, только переделал установку параметров, ато там слишком длинно было.
Исходный вариант и саму суть можно тут посмотреть http://www.manhunter.ru/webmaster/15_seychas_na_sayte_2_gostey_i_3_novostey.html
<?
function num2word() {
	$args = func_get_args();
	$num = $args[0]%100;
	if ($num>19) { $num=$num%10; }
	switch ($num) {
		case 1:  { return $args[1]; }
		case 2:
		case 3:
		case 4:  { return $args[2]; }
		default: { return $args[3]; }
	}
}
?>
Пример:
<?
echo '1 '.num2word(1, 'рубль', 'рубля', 'рублей'); // 1 рубль
echo '2 '.num2word(2, 'рубль', 'рубля', 'рублей'); // 2 рубля
echo '5 '.num2word(5, 'рубль', 'рубля', 'рублей'); // 5 рублей
?>
Конечно при многократном использовании с одинаковыми параметрами исходный вариант был бы удобней, но по сути такое многократное применение бывает очень редко

49. Titov (22.01.2011 / 23:14)
выведет список файлов из директории по маске имени файлв
<?php
function SearchMaska($dir, $maska){
// Открыть заведомо существующий каталог и начать считывать его содержимое
if (is_dir($dir)) {
   if ($dh = opendir($dir)) {
       while (($file = readdir($dh)) !== false) {
	   if(($file !=".") && ($file !="..")){
	       if($myfile = stristr($file,$maska)){
           print "Файл: $myfile<br/>";
		   }
		   }
       }
       closedir($dh);
   }
}
}
SearchMaska('dir/', 'filename'); //// часть имени файла
?>


50. Марсель (23.01.2011 / 00:17)
Более легкий вариант)
<?php 
function SearchMaska($dir, $maska){ 

	if (is_dir($dir)) {

		foreach(array_diff(scandir($dir), array('.', '..')) as $file) {
			if($myfile = stristr($file, $maska))
			   echo 'Файл: '.$myfile.'<br/>'; 
		
		}
	   
	} 
}
SearchMaska('dir/', 'filename'); //// часть имени файла 
?>


51. Titov (24.03.2011 / 19:12)
копирайт на картинку
1 вариант картинка на картинку:
<?php
$img = $_GET['img']; /// путь к картинке которую копирайтим
$im = imagecreatefromjpeg($img); 
$lg = imagecreatefrompng('copyrite.png'); /// наша картинка копирайта
$img_x = imagesx($im);
$img_y = imagesy($im);
$img_x_copy = imagesx($lg);
$img_y_copy = imagesy($lg);
imagecopy($im, $lg, $img_x-$img_x_copy, $img_y-$img_y_copy, 0, 0, $img_x_copy, $img_y_copy); 
header('Content-Type: image/jpeg');  
imagejpeg($im);  
imagedestroy($im); /// чистим мусор
imagedestroy($lg); /// чистим мусор
?>
второй вариант текст на картинку:
<?php
$img = $_GET['img']; 	
$copy = strtoupper($_SERVER['HTTP_HOST']);
if ($img == "") exit(); 
writeTextOnImage($img, "Www.MySuperSite.Com"); 
function writeTextOnImage($filename, $text) 
{ 
    if ($filename == "") exit(); 
    $size_img = getimagesize($filename); 
    if ($size_img[2]==2) $src_img = imagecreatefromjpeg($filename); 
    else if ($size_img[2]==1) $src_img = imagecreatefromgif($filename); 
    else if ($size_img[2]==3) $src_img = imagecreatefrompng($filename); 
    if (!$src_img) exit(); 
    // Назначаем цвет 
    $color = imagecolorallocatealpha($src_img, 255, 255, 0, 10); 
	
$font_file = "impact.ttf"; 
	$img_x = imagesx($src_img);
    $img_y = imagesy($src_img);
	
	$height_font = 13; 
    $angle = 0; 
	
    // Запись текста поверх изображения 
    $xminus = $img_x - 130;
    $box = imagettftext($src_img, $height_font, $angle, $xminus, $img_y - 8, $color, $font_file, $text);
    // Вывод изображения в браузер 
    if ($size_img[2]==2) 
    { 
        header ("Content-type: image/jpeg"); 
        imagejpeg($src_img); 
    } 
    else if ($size_img[2]==1) 
    { 
        header ("Content-type: image/gif"); 
        imagegif($src_img); 
    } 
    else if ($size_img[2]==3) 
    { 
        header ("Content-type: image/png"); 
        imagepng($src_img); 
    } 
    return true; 
}

?>


52. ZipeR (05.04.2011 / 14:41)
Календарь. Скрипт на php
Скрипт предназначен для отображения календаря на текущий месяц
Календарь в американском формате

<?php
  // Вычисляем число дней в текущем месяце
  $dayofmonth = date('t');
  // Счётчик для дней месяца
  $day_count = 1;

  // 1. Первая неделя
  $num = 0;
  for($i = 0; $i < 7; $i++)
  {
    // Вычисляем номер дня недели для числа
    $dayofweek = date('w',
                      mktime(0, 0, 0, date('m'), $day_count, date('Y')));
    // Приводим к числа к формату 1 - понедельник, ..., 6 - суббота
    $dayofweek = $dayofweek - 1;
    if($dayofweek == -1) $dayofweek = 6;

    if($dayofweek == $i)
    {
      // Если дни недели совпадают,
      // заполняем массив $week
      // числами месяца
      $week[$num][$i] = $day_count;
      $day_count++;
    }
    else
    {
      $week[$num][$i] = "";
    }
  }

  // 2. Последующие недели месяца
  while(true)
  {
    $num++;
    for($i = 0; $i < 7; $i++)
    {
      $week[$num][$i] = $day_count;
      $day_count++;
      // Если достигли конца месяца - выходим
      // из цикла
      if($day_count > $dayofmonth) break;
    }
    // Если достигли конца месяца - выходим
    // из цикла
    if($day_count > $dayofmonth) break;
  }

  // 3. Выводим содержимое массива $week
  // в виде календаря
  // Выводим таблицу
  echo "<table border=1>";
  for($i = 0; $i < count($week); $i++)
  {
    echo "<tr>";
    for($j = 0; $j < 7; $j++)
    {
      if(!empty($week[$i][$j]))
      {
        // Если имеем дело с субботой и воскресенья
        // подсвечиваем их
        if($j == 5 || $j == 6) 
             echo "<td><font color=red>".$week[$i][$j]."</font></td>";
        else echo "<td>".$week[$i][$j]."</td>";
      }
      else echo "<td>&nbsp;</td>";
    }
    echo "</tr>";
  } 
  echo "</table>";
?>


53. ZipeR (05.04.2011 / 14:43)
Для того чтобы вывести календарь в российком формате, необходимо изменить только блок вывода 3
Календарь в российком формате

<?php
  ...
  // Выводим содержимое массива $week
  // в виде календаря
  // Выводим таблицу
  echo "<table border=1>";
  for($j = 0; $j < 7; $j++)
  {
    echo "<tr>";
    for($i = 0; $i < count($week); $i++)
    {
      if(!empty($week[$i][$j]))
      {
        // Если имеем дело с субботой и воскресенья
        // подсвечиваем их
        if($j == 5 || $j == 6) 
             echo "<td><font color=red>".$week[$i][$j]."</font></td>";
        else echo "<td>".$week[$i][$j]."</td>";
      }
      else echo "<td>&nbsp;</td>";
    }
    echo "</tr>";
  } 
  echo "</table>";
?>
Для того чтобы вывести календарь на произвольный месяц, достаточно передать в качестве второго параметра функции date() любую дату месяца в виде числа секунд, прошедших с полуночи 1 января 1970 года.

54. ZipeR (05.04.2011 / 14:47)
Подсчёт числа строк в программном проекте
<?php
  ////////////////////////////////////////////////////////// 
  // Рекурсивная функция - спускаемся вниз по каталогу 
  ////////////////////////////////////////////////////////// 
  function scan_dir($dirname) 
  { 
    // Объявляем переменные замены глобальными
    GLOBAL $extentions, $count;
    // Открываем текущую директорию 
    $dir = opendir($dirname); 
    // Читаем в цикле директорию 
    while (($file = readdir($dir)) !== false) 
    { 
      // Если файл обрабатываем его содержимое 
      if($file != "." && $file != "..") 
      { 
        // Если имеем дело с файлом - производим в нём замену
        if(is_file($dirname."/".$file)) 
        { 
          // Извлекаем из имени файла расширение
          $ext = strrchr($dirname."/".$file, "."); 
          foreach($extentions as $exten)
          if(preg_match($exten, $ext))
          {
            // Читаем содержимое файла
            $content = file($dirname."/".$file); 
            // Подсчтываем число файлов
            $count += count($content);
            // Удаляем массив
            unset($content);
          }
        } 
        // Если перед нами директория, вызываем рекурсивно 
        // функцию scan_dir 
        if(is_dir($dirname."/".$file)) 
        { 
          scan_dir($dirname."/".$file); 
        } 
      } 
    } 
    // Закрываем директорию 
    closedir($dir); 
  } 
?>
Воспользоваться результатами можно при помощи следующего кода
Код вызова функции scan_dir()
<?php
  // Имя корневой директории проекта
  $dirname = "softtime"; 
  // Массив с расширениями файлов, для которых следует подсчитывать
  // число строк
  $extentions = array("#\.php#i"); 
  // $extentions = array("#\.cpp#i","#\.h#i");
  // Счётчик строк - глобальная переменная
  $count = 0;
  // Вызов функции, осуществляющей рекурсивный спуск по подкаталогам
  // корневого каталога
  scan_dir($dirname);
  // Записываем число строк в переменную $count
  file_put_contents("test",$count);
?>


55. ZipeR (05.04.2011 / 14:48)
Подсветка синтаксиса кода на PHP
Пример скрипта вы видете в полезных кусках кода на этом форуме.
<?php
// подавляем предупреждение
error_reporting(0);

function highlight_code($code) 
{ 
  // если до этого $code обрабатывали функцией
  // htmlspecaialchars, здесь нужно дописать код, который отменяет ее действие 

  $code = stripslashes($code); 
  if(!strpos($code,"<?") && substr($code,0,2)!="<?") {
    $code="<?php\\n".trim($code)."\\n?>"; 
  }  
  $code = trim($code); 

  return highlight_string($code,true);
} 

// вызываем функцию, к примеру так 
// пример кода
$code = '
if(!$flag)
{
  // пишем всякую ерунду
  echo("Hello");
  $var = 1;
} 
  else break;';
// вызываем функцию
echo highlight_code($code); 
?>

Добавлено через 02:37 сек.
Перевод русского текста в транслит
<?php
  // функция превода текста с кириллицы в траскрипт
  function encodestring($st)
  {
    // Сначала заменяем "односимвольные" фонемы.
    $st=strtr($st,"абвгдеёзийклмнопрстуфхъыэ_",
    "abvgdeeziyklmnoprstufh'iei");
    $st=strtr($st,"АБВГДЕЁЗИЙКЛМНОПРСТУФХЪЫЭ_",
    "ABVGDEEZIYKLMNOPRSTUFH'IEI");
    // Затем - "многосимвольные".
    $st=strtr($st, 
                    array(
                        "ж"=>"zh", "ц"=>"ts", "ч"=>"ch", "ш"=>"sh", 
                        "щ"=>"shch","ь"=>"", "ю"=>"yu", "я"=>"ya",
                        "Ж"=>"ZH", "Ц"=>"TS", "Ч"=>"CH", "Ш"=>"SH", 
                        "Щ"=>"SHCH","Ь"=>"", "Ю"=>"YU", "Я"=>"YA",
                        "ї"=>"i", "Ї"=>"Yi", "є"=>"ie", "Є"=>"Ye"
                        )
             );
    // Возвращаем результат.
    return $st;
  }
?>



56. Azzido (05.04.2011 / 23:19)
Оптимизировал функцию опубликованную Mackler aka Бородатый Одмин.
Код подсчёта общего размера файлов в папке (с вложенными папками):

<?php  

function dirsize($path)  
{  
    $size = 0;  
    $dir_handle = opendir($path);  
    while (($filename = readdir($dir_handle)) !== false) {  
        if ($filename <> '.' and $filename <> '..') {  
            if (is_dir($path . '/' . $filename)) {  
                $size += dirsize($path . '/' . $filename);  
            } elseif (is_file($path . '/' . $filename)) {  
                $size += filesize($path . '/' . $filename);  
            }   
        }   
    }   
    closedir($dir_handle);  
    return $size;  
}   

?>

Использование:
<?php  
echo dirsize('/www/site.ru/dir/');  
?>

Получаем общий размер папки в БАЙТАХ.

Добавлено через 03:51 сек.
Оптимизировал функцию опубликованную Mackler aka Бородатый Одмин.

Функция удаления папки с подпапками:

<?php

function dirclear($path)
{
    $dir_handle = opendir($path);
    while (($filename = readdir($dir_handle)) !== false) {
        if ($filename <> '.' and $filename <> '..') {
            if (is_dir($path . '/' . $filename)) {
                dirclear($path . '/' . $filename);
            } else {
                unlink($path . '/' . $filename);
            } 
        } 
        if (rmdir($path . '/' . $filename)) {
            return true;
        } else {
            return false;
        } 
    } 
    closedir($dir_handle);
} 

?>

Использование:
<?php
dirclear('/www/site.ru/dir/');
?>


57. ZipeR (06.04.2011 / 14:29)
Постраничная навигация на файлах
Файл данных text.txt
1 Программирование
2 Программирование на PHP
3 Программирование на JavaScript
4 Программирование на ASP.NET
5 Программирование на Java
6 Программирование на Perl
7 Программирование на C++
8 Программирование на Pascal
9 Программирование на Fortran
10 Программирование на Assembler
Постраничная навигация

<?php
  // Имя файла
  $filename = "text.txt";
  // Число позиций на странице
  $pnumber = 3;
  // Открываем файл для чтения
  $bufer = file_get_contents($filename);

  // Находим все строки при помощи регулярного выражения
  preg_match_all("#([\d]+) ([^\n]+)(\n|$)#U",
                 $bufer, 
                 $out,
                 PREG_PATTERN_ORDER);
  // Формируем промежуточный массив
  for($i = 0; $i < count($out[1]); $i++)
  {
    $temp[] = trim($out[2][$i]);
  }

  // Проверяем передан ли номер текущей страницы
  if(isset($_GET['page'])) $page = $_GET['page'];
  else $page = 1;
  // Число страниц
  $total = count($temp);
  $number = (int)($total/$pnumber);
  if((float)($total/$pnumber) - $number != 0) $number++;

  $start = (($page - 1)*$pnumber + 1);
  $end = $page*$pnumber + 1;
  if($end > $total) $end = $total;

  // Выводим содержимое страниц
  for($i = $start; $i < $end; $i++)
  {
    echo $temp[$i]."<br>";
  }

  // Постраничная навигация
  for($i = 1; $i <= $number; $i++)
  {
    // Если это произвольная страница
    if($i != $number)
    {
      if($page == $i)
      {
        echo "[".(($i - 1)*$pnumber + 1)."-".$i*$pnumber."]&nbsp;";
      }
      else
      {
        echo "<a href='$_SERVER[PHP_SELF]?page=$i'>[".
             (($i - 1)*$pnumber + 1)."-".$i*$pnumber."]</a>&nbsp;";
      }
    }
    // Если это последняя страница заменяем последнюю цифру 
    // максимальным числом позиций в массиве $temp
    else
    {
      if($page == $i)
      {
        echo "[".(($i - 1)*$pnumber + 1)."-".($total - 1)."]&nbsp;";
      }
      else
      {
        echo "<a href='$_SERVER[PHP_SELF]?page=$i'>[".
             (($i - 1)*$pnumber + 1)."-".($total - 1)."]</a>&nbsp;";
      }
    }
  }
?>


58. ZipeR (07.04.2011 / 16:22)
Вывод случайной цитаты(статьи).
<?php
  $quotes[] = 'Монета, упавшая на дно реки, может показаться рыбам подарком с неба. Что они будут делать с этим подарком?';
    $quotes[] = 'Если увидишь нечто, к чему стоит приложить руку, поступи не так, как подсказывает разум, но как велит настроение.';
    $quotes[] = 'Если то, что ты делаешь, трудно тебе - посмотри, нуждаешься ли ты в этом.';
    $quotes[] = 'Возможно, твои ошибки - это то, что нужно Миру.';
    $quotes[] = 'Всякий может ударить слабого, но только слабый хочет ударить слабого.';
 srand ((double) microtime() * 1000000);
    $random_number = rand(0,count($quotes)-1);
 ?>
Выводим на страницу:
<?php
 echo ($quotes[$random_number]);
?>


59. ramzes (07.04.2011 / 23:12)
66. ZipeR, echo array_rand($quotes);

Добавлено через 09:57 сек.
<?php

function navi($self, // текущий url
$total, // кол-во элементов
$page, // текущая страница
$step // кол-во элементов на страницу
){
$return.='<b>Страницы:</b> ';
if($page>0){ $return.='<a href="'.$self.'page='.($page - $step).'&amp;'.SID.'"><b>«</b></a>';
}else{ $return.='<span class="navithis">«</span>';} // вперед


if($total>0){
$ba=ceil($total/$step);
$ba2=$ba*$step-$step;

$asd=$page-($step*3);
$asd2=$page+($step*4);
if($asd<$total && $asd>0){ $return.='<a href="'.$self.'page=0&amp;'.SID.'">1</a><span class="navithis">&larr;</span>'; }
for($i=$asd; $i<$asd2;){
if($i<$total && $i>=0){
$ii=floor(1+$i/$step);
if($page==$i){ $return.='<span class="navithis">'.$ii.'</span>';
}else{
$return.='<a href="'.$self.'page='.$i.'&amp;'.SID.'">'.$ii.'</a>'; }}
$i=$i+$step; }
if($asd2<$total){ $return.='<span class="navithis">&rarr;</span><a href="'.$self.'page='.$ba2.'&amp;'.SID.'">'.$ba.'</a>'; }}

if($total > $page + $step){ $return.='<a href="'.$self.'page='.($page + $step).'&amp;'.SID.'"><b>»</b></a>';
}else{ $return.='<span class="navithis">»</span>'; } // назад
return '<div class="navi">'.$return.'</div>';
}


?>
типа того

60. ZipeR (10.04.2011 / 14:57)
Снятие скриншота с 3gp видеоролика
<?php 
/* 
* Снятие скриншота с 3gp видеоролика 
* автор: nc_soft 
* 17.01.08 
*/ 

if (!class_exists(ffmpeg_movie)) 
{ 
die('ничего не выйдет, нужна ffmpeg на хостинге');
} 

//создание объекта (тестовый файл test.3gp) 
$file='test.3gp'; 

if (file_exists($file)) 
{ 
$mov = new ffmpeg_movie($file); 
} 
else 
{ 
die('невозможно найти файл'); 
} 

//номер кадра 
$frame = 50; 

//ширина 
$w = $mov->GetFrameWidth(); 

//высота 
$h = $mov->GetFrameHeight(); 

//извлечение кадра 
$ff_frame = $mov->getFrame($frame); 

if ($ff_frame) 
{ 
//в формат GD 
$gd_image = $ff_frame->toGDImage(); 

if ($gd_image) 
{ 
//вывод (для примера в gif) 
header('Content-type: image/gif'); 
imagegif($gd_image); 

/*можно сделать изменение размера, нанесение копирайтов и водяных знаков, в общем все что применимо для GD*/ 
} 
else 
{ 
die('невозможно преобразовать в GD'); 
} 
} 
else 
{ 
die('невозможно извлечь кадр'); 
} 

/* 
описания всех методов ffmpeg_movie смотрим тут 
http://ffmpeg-php.sourceforge.net/doc/api/ffmpeg_movie.php 
*/ 
?>

Добавлено через 01:44 сек.
Анимация из видео
<?php 
$file = "file.avi"; 
$movie = new ffmpeg_movie($file); 
$gif=new ffmpeg_animated_gif("image.gif",100 ,100 ,24); 
for ($frame = 150; $frame <= 200; $frame++) { 
$image = $movie->getFrame($frame); 
$gif->addFrame($image);} 
?>
Получаем анимированную картинку из видео!
необходима поддержка ffmpeg


61. ZipeR (10.04.2011 / 15:00)
Отправка сообщений на email
<?php 
function mail_send($email, $smail, $subject, $message, $info = '', $pr = '') 
{ 
$email = text_filter( $email ); 
$smail = text_filter( $smail ); 
$subject = text_filter( $subject ); 
$pr = ( !$pr ) ? 3 : intval( $pr ); 
if( $info ) $message = $message . ' ' . _IP . ': '. getip() . ' ' . _BROWSER . ': ' . getagent(); 
$mheader = 'MIME-Version: 1.0n' 
.'Content-Type: text/html; charset=' . _CHARSET . 'n' 
.'Content-Transfer-Encoding: 8bitn' 
.'Reply-To: "' . $smail .'" <' . $smail .'>n' 
.'From: "' . $smail .'" <' . $smail .'>n' 
.'Return-Path: <' . $smail .'>n' 
.'X-Priority: ' . $pr .'n' 
.'X-Mailer: CMS Mailern'; 
return mail( $email, $subject, $message, $mheader ); 
?>
Отправка сообщений на email
$info - указываем true, чтобы в письмо добавилась информация о IP и браузере пользователя
$pr - приоритет письма 1..5


Добавлено через 01:56 сек.
Защита от XSS
<?php
function antihack(&$var){ 
if(is_array($var)) array_walk($var, 'antihack'); 
else $var = htmlspecialchars(stripslashes(mysql_real_escape_string($var)), ENT_QUOTES, 'UTF-8'); 
} 
foreach(array('_SERVER', '_GET', '_POST', '_COOKIE', '_REQUEST') as $v){ 
if(!empty(${$v})) array_walk(${$v}, 'antihack'); 
} 
?>

Добавлено через 04:08 сек.
Защита от прямых ссылок
<?php
# Защита от прямых ссылок 
# автор: Nc_Soft 
# 05.07.09 
# Это позволит скачать ваш файл только с вашего сайта. 
# надо создать вот такой .htaccess 

RewriteEngine on 
RewriteBase / 

# если надо разрешить скачку при пустом рефере раскомментируйте это 
# RewriteCond %{HTTP_REFERER} !^$ 

# Дальше список идет набор разрешенных доменов 
RewriteCond %{HTTP_REFERER} !^http(s)?://(www.)?snippets.pp.ru [NC] 
RewriteCond %{HTTP_REFERER} !^http(s)?://(www.)?wen.ru [NC] 

# Форматы файлов, для которых устанавливается защита (например, mp3) 
RewriteRule .(mp3)$ http://ya.ru 

#Все запросы на http://snippets.pp.ru/1.mp3 перекинутся на http://ya.ru
?>
# Это позволит скачать ваш файл только с вашего сайта.
# надо создать вот такой .htaccess


62. ZipeR (10.04.2011 / 15:08)
Антиреклама
<?php 

function antispam_help($text) 

{ 

$dom = array('www\.','wap\.'); //поддомены 

if(preg_match('#^(https?|ftp)://('.implode('|',$dom).')?'.str_replace('.', '\.', $_SERVER['SERVER_NAME']).'#', $text[0])) 

return '<a href="'.$text[0].'">'.$text[0].'</a>'; 

else 

return '[реклама]'; 

} 



function antispam($text) 

{ 

return preg_replace_callback("#(https?|ftp)://\S+[^\s.,>)\];'\"!?]#", 'antispam_help', $text); 

} 

?>
Функция антиспама. Заменяет все левые ссылки на слово [реклама], а остальные подсвечивает.
Применение:
echo antispam($text);
Где $text - ваш текст.


Добавлено через 01:05 сек.
Функция проверки пароля на безопастность
<?php
/* 
Задача: 
Написать функцию проверки пароля на безопасность 
* длина не меньше 6 символов 
* должен содержать и символы и числа 
* не должен содержать больше (>=) 3 линейно расположенных на клавиатуре символов или цифр, например таких как "lkj" или "cvb" 
* если пароль безопасен - вернуть истину, нет - ложь 
*/ 
functionisGood ($pass) 
{$kbStrings = array('1234567890','qwertyuiop','asdfghjkl','zxcvbnm',
'0987654321','poiuytrewq','lkjhgfdsa','mnbvcxz'); 
$isGood = false; 
if (strlen($pass) >= 6) { 
if (preg_match('/[a- z]/i',$pass) && preg_match('/[0-9]/',$pass)) { 
$count = strlen($pass) - 2; 
$isGood = true; 
} else { 
$isGood = false; 
break 2; 
} } } } } return $isGood; 
}
?>


Добавлено через 02:49 сек.
Вывод даты нормальным русским языком
<?php
function rusdate($d) 
{ 
$montharr = array("января","февраля","марта","апреля","мая","июня","июля","августа","сентября","октября","ноября","декабря");
$i = date("m",$d) - 1; 
return date("j",$d)." $montharr[$i] ".date("Y",$d); 
}
?>



63. ZipeR (10.04.2011 / 15:12)
Перевод секунд в дни(функция из WAP-MotoR)
<?php 
function makestime($string) { 

$day=floor($string/86400); 
$hours=floor(($string/3600)-$day*24); 
$min=floor(($string-$hours*3600-$day*86400)/60); 
$sec=$string-($min*60+$hours*3600+$day*86400); 

return $day.' дн. '.$hours.':'.$min.':'.$sec; 
} 
?>

Добавлено через 00:46 сек.
Определяем часть дня
<?php 
function hi(){ 
$h=date('H'); 
$i=date('i'); 
if ($h>=0 && $h<=4){$hi='Доброй ночи!'; } 
elseif ($h>4 && $h<=12){$hi='Доброе утро!';} 
elseif ($h>=12 && $h<=17){$hi='Добрый день!';} 
elseif ($h>=17 && $h<=22){$hi='Добрый вечер!';} 
elseif ($h>=22 && $h<=23){$hi='Доброй ночи!';} 
return $hi;} 
?>
Определение утра, дня, вечера и ночи

Добавлено через 02:06 сек.
Создание скриншота сайта
<?php 
$browser = new COM("InternetExplorer.Application"); 
$handle = $browser->HWND; 
$browser->Visible = true; 
$browser->Navigate("http://ya.ru"); 
while ($browser->Busy) { 
com_message_pump(4000); 
} 
$im = imagegrabwindow($handle, 0); 
$browser->Quit(); 
imagepng($im, "iesnap.png"); 
?>
Создание скриншота сайта
Работает под виндой на PHP 5 >= 5.2.2


Добавлено через 07:31 сек.
Функция Антимата

<?php 
//Маты записываёте в antmat.dat
function antimat($msg) { 
if (file_exists("antimat.dat")) { 
$mat = file_get_contents("antimat.dat"); 
$arr_mat = explode("|",$mat); 
foreach($arr_mat as $value) { 
if($value != "") { 
$msg = preg_replace("|$value|iu","***",$msg); 
}}} 
return $msg; 
} 
?>



64. ZipeR (10.04.2011 / 15:24)
Функция BBCode
<?php 

function bbcode($var = '') 

{ 

$var = strip_tags($var); 

$var = ereg_replace("&", "&amp;", $var); 

$var = ereg_replace("\[br\]", "<br/>", $var); 

$var = preg_replace('#\[b\](.*?)\[/b\]#si', '<span style="font-size: 20px">\1</span>', $var); 

$var = preg_replace('#\[img\](.*?)\[/img\]#si', '<a href=\"\1\" title=\"Нажмите для масштабирования\"><img src=\"\1\" width=\"100\" height=\"100\" alt=\"Картинка\"/></a>', $var); 

$var = preg_replace('#\[i\](.*?)\[/i\]#si', '<i>\1</i>', $var); 

$var = preg_replace('#\[u\](.*?)\[/u\]#si', '<u>\1</u>', $var); 

$var = preg_replace('#\[s\](.*?)\[/s\]#si', '<strike>\1</strike>', $var); 

$var = preg_replace('#\[red\](.*?)\[/red\]#si', '<font color="#ff7900">\1</font>', $var); 

$var = preg_replace('#\[green\](.*?)\[/green\]#si', '<font color="#00FF00">\1</font>', $var); 

$var = preg_replace('#\[blue\](.*?)\[/blue\]#si', '<font color="#0000FF">\1</font>', $var); 

$var = preg_replace('#\[url=(.*?)\](.*?)\[/url\]#si', '<a href="\1">\2</a>', $var); 

return $var; 

} 

?>



65. ZipeR (17.04.2011 / 14:09)
Функция для наложения водяного знака на изображение.
Передается 2 параметра: $file – путь до исходного изображения, $watermark – путь до картинки-водяного знака.
После того, как функция отработает, поверх исходного файла в нижнем правом углу появляется водяной знак.


<?php 
function watermark($file, $watermark) { 
    if(empty($file) | empty($watermark)) return false; 
    $wh = getimagesize($watermark); 
    $fh = getimagesize($file); 
    $rwatermark = imagecreatefromjpeg($watermark);  
//Иногда может понадобиться наложить прозрачный png, тогда заменяем функцию на imagecreatefrompng 
    $rfile = imagecreatefromjpeg($file); 
    imagecopy($rfile, $rwatermark, $fh[0] - $wh[0], $fh[1] - $wh[1], 0, 0, $wh[0], $wh[1]); 
    imagejpeg($rfile, $file, '100'); 
    imagedestroy($rwatermark); 
    imagedestroy($rfile); 
    return true; 
} 
watermark('1.jpg', '2.jpg'); //Теперь 1.jpg в нижнем правом углу обляпался 2.jpg 
?> 

Добавлено через 02:29 сек.
Функция для изменения размеров изображения.
Передается 4 параметра: $file – путь до исходного изображения, $out – путь, куда сохранить изображение с новым размером, $w – ширина на выходе, $q – качество.
<?php
function resize_image($file, $out, $w = 200, $q = 90) {
    if(empty($file) | empty($out)) return false;
    $src = imagecreatefromjpeg($file);
    $w_src = imagesx($src);
    $h_src = imagesy($src);
    $ratio = $w_src/$w;
    $w_dest = round($w_src/$ratio);
    $h_dest = round($h_src/$ratio);
    $dest = imagecreatetruecolor($w_dest, $h_dest);
    imagecopyresampled($dest, $src, 0, 0, 0, 0, $w_dest, $h_dest, $w_src, $h_src);
    imagejpeg($dest, $out, $q);
    imagedestroy($dest);
    imagedestroy($src);
    return true;
}
resize_image('1.jpg', '2.jpg', 200, 50); //Изменяет размер картинки 1.jpg, лежащей в одной папке со скриптом, уменьшенное изображение сохраняет как 2.jpg


?>


66. KOZZ (18.06.2011 / 20:15)
<?php
# защита входных данных (для POST данных, пришедших от юзера)
function check_in($var){
return mysql_real_escape_string(trim(htmlentities($var, ENT_QUOTES, 'UTF-8')));
}

// пример
$_POST = array_map('check_in',$_POST);
$_POST['text'] = check_in($_POST['text']);

# проверка длины строки (от $min символов до $max)
function check_strlen($string,$min,$max){
$a =  filter_var(x_strlen($string), FILTER_VALIDATE_INT, array('options'=>array('min_range'=>$min,'max_range'=>$max)));
return ($a !== false) ? true : false;
}

// пример
if(check_strlen($_POST['text'],3,100)){echo 'Строка от 3 до 100 символов включительно';}

# преобразовывает число меньшее нуля в 1 
function more_zero($var){
$var = abs(intval($var));
return ($var<=0) ? 1 : $var;
}

# постраничная навигация (использует предыдущую функцию more_zero() )
function navigation($p,$onpage,$count){

$pages = (int) ceil($count / $onpage); # всего страниц
$start = (int) ($p-1) * $onpage; # стартовая позиция
$end = (int) more_zero($p * $onpage); # конечная позиция

return array('start'=>$start,'end'=>$end,'pages'=>$pages);
}

// пример

$page = (isset($_GET['p'])) ? more_zero($_GET['p']) : 1; // текущая страница
$arr = range(0,100); // массив выводимых элементов, могут быть имена файлов, итд итп, в данном случае - цифры от 0 до 100
$arr_onpage = 10; // по 10 штук на страницу
$arr_count = count($arr);

$nav = navigation($page,$arr_onpage,$arr_count);

for($i=$nav['start'];$i<=$nav['end'];$i++){
if(!array_key_exists($i,$arr)){continue;}
echo $arr[$i].'<br />';
}

if($nav['pages']>1){

if($p>1) {echo '<a href="?p=1"><big>&laquo;</big></a> ... <a href="?p='.($p-1).'">Назад</a> ';}
echo '&#8226;';
if($p<$nav['pages']) {echo ' <a href="?p='.($p+1).'">Далее</a> ... <a href="?p='.$nav['pages'].'"><big>&raquo;</big></a>';}


}



?>


67. Владислав (10.07.2011 / 23:00)
<?php
$count = 0;
function countf($dir) {
	static $count;
	foreach(glob($dir) as $obj) {
		if(is_file($obj) and $obj != '.' and $obj != '..') {
			$count += 1;
		} else {
			countf($obj . '/*');
		}
	}
	return $count;
}

echo countf('content');
?>
с рекурсивом

68. Titov (23.08.2011 / 15:11)
функция шифрования пароля
<?php
function crypt_apr1_md5($plainpasswd) {
    $salt = substr(str_shuffle("abcdefghijklmnopqrstuvwxyz0123456789"), 0, 8);
    $len = strlen($plainpasswd);
    $text = $plainpasswd.'$apr1$'.$salt;
    $bin = pack("H32", md5($plainpasswd.$salt.$plainpasswd));
    for($i = $len; $i > 0; $i -= 16) { $text .= substr($bin, 0, min(16, $i)); }
    for($i = $len; $i > 0; $i >>= 1) { $text .= ($i & 1) ? chr(0) : $plainpasswd{0}; }
    $bin = pack("H32", md5($text));
    for($i = 0; $i < 1000; $i++) {
        $new = ($i & 1) ? $plainpasswd : $bin;
        if ($i % 3) $new .= $salt;
        if ($i % 7) $new .= $plainpasswd;
        $new .= ($i & 1) ? $bin : $plainpasswd;
        $bin = pack("H32", md5($new));
    }
    for ($i = 0; $i < 5; $i++) {
        $k = $i + 6;
        $j = $i + 12;
        if ($j == 16) $j = 5;
        $tmp = $bin[$i].$bin[$k].$bin[$j].$tmp;
    }
    $tmp = chr(0).chr(0).$bin[11].$tmp;
    $tmp = strtr(strrev(substr(base64_encode($tmp), 2)),
    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
    "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");
    return "$"."apr1"."$".$salt."$".$tmp;
}
?>


69. 3DwEp (23.12.2011 / 01:07)
Подсчёт возраста по дате рождения
<?php 
function calc_age($d, $m, $y) 
{ 
$age = date('Y') - $y; 
$_m = date('m'); 
if($_m < $m || ($_m == $m && date('d') < $d)) 
$age--; 
return $age; 
}
## Вызов: 
echo calc_age(13, 06, 1993);  // Число , Месяц, Год
?>


70. halsoft (23.12.2011 / 11:07)
80. Давай упрощу эту функцию:

<?php 
function calc_age($d, $m, $y)  {
return date('Y', time()-mktime(0,0,0,$m,$d,$y))-1970; 
}
## Вызов: 
echo calc_age(13, 6, 1993);
?>

Ну это для тех, кто моложе 1970 ))

71. KOZZ (23.12.2011 / 21:57)
Функция отмечает выделенный вариант формы radio/checkbox/select если переменная "a" равна значению "b"
<?php
function check($a,$b,$type='c'){
// с - checkbox
// r - radio
// s - select

if($type == 's'){$text = 'selected="selected"';} else {$text = 'checked="checked"';}
return $result = ($a == $b) ? $text : '';
}
?>


72. Николай (11.01.2012 / 11:38)
Переименование файлов при занесение в базу данных и дерикторию соответственно

<?php 
  $dir = "files/photo/"; 
  echo get_id($dir); 
  function get_id($dir) 
  { 
    $number = 0; 
    if (is_dir($dir)) 
    { 
      if ($dh = opendir($dir)) 
      { 
        while (($file = readdir($dh)) !== false) 
        { 
          if(is_file($dir.$file)) 
          { 
            if(preg_match("|^file_([\d]+).jpg$|", $file, $out)) 
            { 
              if($number < $out[1]) $number = $out[1]; 
            } 
          } 
        } 
        closedir($dh); 
      } 
    } 
    return $number + 1; 
  } 
?> 


73. Azzido (21.07.2012 / 21:11)
Шифрование по ключу
(Источник: snippets.pp.ru)

<?php

$phrase = '[color=#00cc00]secret message[/color]';
$key = '[color=#00cc00]key[/color]';

function encrypt($key, $text) {
        $cipher = mcrypt_module_open(MCRYPT_BLOWFISH,'','cbc','');
        mcrypt_generic_init($cipher, $key, '12345678');
        $encrypted = mcrypt_generic($cipher,$text);
        mcrypt_generic_deinit($cipher);
        $encrypted = bin2hex($encrypted);
        return $encrypted;
}

function decrypt($key, $encrypted) {
        $encrypted = hex2bin($encrypted);
        $cipher = mcrypt_module_open(MCRYPT_BLOWFISH,'','cbc','');
        mcrypt_generic_init($cipher, $key, '12345678');
        $decrypted = mdecrypt_generic($cipher,$encrypted);
        mcrypt_generic_deinit($cipher);
        return $decrypted;
}

$encrypt = encrypt($key, $phrase);
$phrase = decrypt($key, $encrypt);
echo $encrypt, ' = ', $phrase;

?>
12345678 это размер блока, его можно задать произвольный, не задавать вообще (0) или сгенерить через mcrypt_enc_get_iv_size

74. Azzido (23.07.2012 / 20:18)
Рекурсивное удаление всех файлов и каталогов

<?php
function rrmdir($dir) {
    foreach(glob($dir . '/*') as $file) {
        if(is_dir($file))
            rrmdir($file);
        else
            unlink($file);
    }
    rmdir($dir);
}

rrmdir('tmp/dir/cleandir');

?>


75. ramzes (02.12.2014 / 12:48)
Функция определения приоритетного языкового пакета, из заголовков браузера
<?php
function LocaleAuto(){
        if(!isset($_SESSION['accept_language'])){
            preg_match_all('|([a-z\-]+);q=([\d\.]+)|i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $match_lang);
            $selected = 'ru';
            $level = 0;
            foreach( $match_lang[1] as $n=>$v){
                if($match_lang[2][$n] > $level){
                    $level = $match_lang[2][$n];
                    $selected = $v;
                }
            }
            $language = explode('-', $selected);
            $_SESSION['accept_language'] = ($language[0]!='') ? $language[0] : $selected;
        }
        return $_SESSION['accept_language'];
    }


echo LocaleAuto(); // ru


76. Станислав Крунич (08.12.2014 / 13:14)
<?php
	/**
	 * findInTree($array, $key, $value) Поиск массива в дереве по ключ=>значение
	 * @param array $array исходный массив
	 * @param string $key ключ
	 * @param string $value значение
	 * @access static
	 * @return array
	 */
	public static function findInTree($array, $key, $value, $key2 = null, $value2 = null)
	{
		$results = array();

		$arrIt = new \RecursiveIteratorIterator(new \RecursiveArrayIterator($array));

		foreach ($arrIt as $sub) {
			$subArray = $arrIt->getSubIterator();
			if(!is_null($key2) && !is_null($value2))
			{
				if ($subArray == $value2 && $subArray == $value) {
					$results = iterator_to_array($subArray);
				}
			}
			else
			{
				if ($subArray === $value) {
					$results = iterator_to_array($subArray);
				}
			}
		}
		return $results;
	}

Добавлено через 01:18 сек.
<?php 
	/**
	 * excludeFromTree($array, $key, $value) Исключение из массивов по ключ=>значение
	 * @param array object $array исходный массив
	 * @param string $key ключ
	 * @param string $value значение
	 * @access static
	 * @return array
	 */
	public static function excludeFromTree($array, $key, $value)
	{
		$results = array();

		$arrIt = new \RecursiveIteratorIterator(new \RecursiveArrayIterator($array));

		foreach($arrIt as $sub) {
			$subArray = $arrIt->getSubIterator();
			if($subArray[$key] === $value)
				unset($subArray);
			else $results[] = iterator_to_array($subArray);
		}
		return $results;
	}

Добавлено через 04:09 сек.
<?php

	/**
	 * Прицепляем обработчик (функцию) к каждому элементу массива
	 * @param array $array
	 * @param callback $callback
	 * @access static
	 * @return array
	 */
	public static function arrayMapDeep($array, $callback)
	{
		$new = [];
		foreach ($array as $key => $val)
		{
			if(is_array($val))
				$new[$key] = self::arrayMapDeep($val, $callback);
			 else
				 $new[$key] = call_user_func($callback, $val);
		}
		return $new;
	}


77. Titov (18.07.2023 / 15:45)
Функция определения приоритетного языкового пакета, из заголовков браузера
@ramzes 02.12.2014 / 12:48
<?php
function getPreferredLanguage($header)
{
    // Получаем список языковых пакетов из заголовка Accept-Language
    $languages = [];
    preg_match_all('/([a-z]{1,8}(?:-[a-z]{1,8})?)(?:[^a-z-]|$)/i', $header, $matches);
    
    // Формируем массив с приоритетами языковых пакетов
    foreach ($matches[1] as $language) {
        $qpos = strpos($language, ';q=');
        if ($qpos !== false) {
            $language = substr($language, 0, $qpos);
        }
        $languages[] = $language;
    }
    
    // Возвращаем первый языковой пакет с наибольшим приоритетом
    return reset($languages);
}

// Пример использования
$header = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
$preferredLanguage = getPreferredLanguage($header);

echo "Приоритетный языковой пакет: " . $preferredLanguage;
?>

Добавлено через 05:24 сек.
Рекурсивное удаление всех файлов и каталогов
@Azzido 23.07.2012 / 20:18

<?php
function recursiveDelete($path)
{
    // Проверяем, является ли путь директорией
    if (is_dir($path)) {
        // Открываем директорию
        $dirHandle = opendir($path);
        
        // Проходим по всем элементам в директории
        while (($file = readdir($dirHandle)) !== false) {
            // Пропускаем текущую и родительскую директории
            if ($file != '.' && $file != '..') {
                // Формируем полный путь к элементу
                $filePath = $path . '/' . $file;
                
                // Если элемент является директорией, вызываем функцию рекурсивно
                if (is_dir($filePath)) {
                    recursiveDelete($filePath);
                } else {
                    // Если элемент является файлом, удаляем его
                    unlink($filePath);
                }
            }
        }
        
        // Закрываем директорию
        closedir($dirHandle);
        
        // Удаляем саму директорию
        rmdir($path);
    } else {
        // Если путь указывает на файл, просто его удаляем
        unlink($path);
    }
}

// Пример использования
$directoryPath = '/путь/к/директории';
recursiveDelete($directoryPath);
?>


78. Titov (18.07.2023 / 15:55)
Рекурсивное удаление всех файлов и каталогов
Azzido 23.07.2012 / 20:18
или так
function recursiveDelete($path) {
    if (is_dir($path)) {
        array_map('recursiveDelete', glob($path . '/*')) == rmdir($path);
    } else {
        unlink($path);
    }
}


79. ramzes (21.07.2023 / 12:53)
Titov, и в чем выгода? 9 лет прошло))

80. Azzido (09.11.2023 / 21:46)
Titov, ну да, многие действия можно выполнить разными способами, эта тема была создана больше 10 лет назад, когда форум был оживлённый, и многие интересующиеся PHP часто задавали простейшие вопросы, поэтому сюда собирали некоторые интересные фрагменты когда, чтоб было на что ссылаться в примерах, многие сайтостроением занимались со смартфонов (которые, естественно, были не такие мощные как сейчас), и было трудно находить учебники и простую информацию.
Я, как куратор темы, просто редактировал куски кода, которые сюда кидали другие пользователи (кстати, в старых версиях движка не было возможности у кураторов редактировать чужие посты, только удалять, поэтому тут посты опубликованы от моей учётки, но писали их другие люди).

URL: https://visavi.net/topics/380