Отдаю на критику следующий код - как-то получилось много и странно... А может, кому-нибудь пригодится)
открывается изображение, на него накладывается текст , считается время до Нового Года и тоже кидается на изображение.
<?
class Main
{
var $timex;
var $month;
var $day;
var $year;
function win2uni($s)
{
$s = convert_cyr_string($s,'w','i'); // преобразование win1251 -> iso8859-5
for ($result='', $i=0; $i<strlen($s); $i++) {
$charcode = ord($s[$i]);
$result .= ($charcode>175)?"&#".(1040+($charcode-176)).";":$s[$i];
}
return $result;
}
function Main()
{
if ($this->GetDate())
$this->TimeTo();
// echo ($this->timex);
return true;
}
function GetDate()
{
$this->month = '12';
$this->day = '31';
$this->year = date("Y");
//die($this->year);
return true;
}
function TimeTo()
{
$m = $this->month;
$d = $this->day;
$y = $this->year;
$mn = date("m");
$dn = date("d");
$yn = date("y");
$hh = date("H");
$mm = date("i");
$ss = date("s");
$diff = mktime(23,59,59,$m,$d,$y)-mktime($hh,$mm,$ss,$mn,$dn,$yn);
$days = $diff/60/60/24;
$hours = $diff/60/60 - intval($days)*24;
$minutes = $diff/60 - intval(intval($days*24)*60);
$seconds = $diff - intval(intval(intval($days*24*60))*60);
$text1 = "До Нового Года осталось ";
$text.= round($days);
$mins = round($days)."";
if ($mins == "11" or $mins == "12" or $mins == "13" or $mins == "14") $text.= " дней "; else
if (
$mins[strlen($mins)-1] == "2"
or $mins[strlen($mins)-1] == "3"
or $mins[strlen($mins)-1] == "4")
$text.= " дня "; else
if($mins[strlen($mins)-1] == "1")
$text.= " день "; else
$text.= " дней ";
$text.= round($hours);
if (round($hours) == 1 or round($hours == 21)) $text.= " час "; else
if (round($hours) == 2 or round($hours) == 3 or round($hours) == 4 or round($hours) == 22 or round($hours) == 23) $text.= " часа ";
else $text.= " часов ";
$text.= round($minutes);
$mins = round($minutes)."";
if ($mins == "11" or $mins == "12" or $mins == "13" or $mins == "14") $text.= " минут "; else
if (
$mins[strlen($mins)-1] == "2"
or $mins[strlen($mins)-1] == "3"
or $mins[strlen($mins)-1] == "4")
$text.= " минуты "; else
if($mins[strlen($mins)-1] == "1")
$text.= " минута "; else
$text.= " минут ";
$text.= round($seconds);
$mins = round($seconds)."";
if ($mins == "11" or $mins == "12" or $mins == "13" or $mins == "14") $text.= " секунд "; else
if (
$mins[strlen($mins)-1] == "2"
or $mins[strlen($mins)-1] == "3"
or $mins[strlen($mins)-1] == "4")
$text.= " секунды "; else
if($mins[strlen($mins)-1] == "1")
$text.= " секунда "; else
$text.= " секунд ";
header("Content-type:image/jpg");
$im = imagecreatefromjpeg("pic.jpg");
//imagestring($im,1,10,10,$text,"#fff");
imagettftext($im,12,0,20,19,12700,"arial.ttf",$text1);
imagettftext($im,9,0,1,148,0,"arial.ttf",$text);
imagettftext($im,12,90,220,130,38700,"arial.ttf"," infodesign.ru");
imagettftext($im,10,0,15,168,0,"arial.ttf","НОВОГОДНЕЕ ПРЕДЛОЖЕНИЕ");
imagejpeg($im);
imagedestroy($im);
return true;
}
}
$X = new Main();
?>
$diff = mktime(23,59,59,$m,$d,$y)-mktime($hh,$mm,$ss,$mn,$dn,$yn); - возращает разницу между текущим моментом и почти полночью 31 декабря текущего года .
вот только почему так много кода, когда можно его уменьшить раза в 2 точно.
во первых
$mn = date("m");
$dn = date("d");
$yn = date("y");
$hh = date("H");
$mm = date("i");
$ss = date("s");
$diff = mktime(23,59,59,$m,$d,$y)-mktime($hh,$mm,$ss,$mn,$dn,$yn);
на
$diff = mktime(23,59,59,$m,$d,$y)-time();
во вторых, преобразование окончаний можно было вынести в одну функцию
в третьих, GetDate() вообще легче вырезать и вместо (23,59,59,$m,$d,$y) поставить (23,59,59,12,31,date("Y"))
Ну или хотя бы не
$m = $this->month;
$d = $this->day;
$y = $this->year;
...
...mktime(23,59,59,$m,$d,$y)...
а
...mktime(23,59,59,$this->month,$this->day,$this->year)....
И вообще, память жалеть надо)
Но это мелочи)
P.S. Всех с наступающим новым годом)
чтобы получилось мало и компактно. узнать бы ещё, почему ошибка на час... и что с информером наверху сообщества - что-то не верится, что до НГ так мало осталось..)
а зачем было пихать это в отдельный класс? O.O
да, и еще... вот утилита для подсветки php-кода, написанная как раз для @дневников - она, кстати, сохраняет отступы слева. (А то в посте все слилось в одну сосиску, тяжело читать >.< )
$diff = mktime(23,59,59,$m,$d,$y)-time();
мы же считаем до Нового Года?
долгая история, срочно делали эту бойду для заказчика - внедрили в CMS ку , она там просто класс вызывать будет.
а какие-нить мысли насчет вычисления оставшихся дней - часов - минут есть? вместо
$days = $diff/60/60/24;
$hours = $diff/60/60 - intval($days)*24;
$minutes = $diff/60 - intval(intval($days*24)*60);
$seconds = $diff - intval(intval(intval($days*24*60))*60); ...
мне проще всего было бы вот так =)
function writetext($image, $size, $angle, $x, $y, $color, $font, $text)
{
imagettftext($image, $size, $angle, $x, $y, $color, $font, mb_convert_encoding($text, "UTF-8", "CP-1251"));
}
function wform($count, $single, $partitive, $plural)
{
return in_array($count,
array(1, 21, 31, 41, 51)) ? $single : (
in_array($count, array(2, 3, 4, 22, 23, 24, 32, 33, 34, 42, 43, 44, 52, 53, 54)) ? $partitive : $plural);
}
writetext($img, 9, 0, 1, 148, $black, "arial.ttf",
sprintf("%d %s %d %s %d %s %d %s",
floor($diff / 86400),
wform(floor($diff / 86400), "день", "дня", "дней"),
floor(($diff % 86400) / 3600),
wform(floor(($diff % 86400) / 3600), "час", "часа", "часов"),
floor(($diff % 3600) / 60),
wform(floor(($diff % 3600) / 60), "минута", "минуты", "минут"),
floor($diff % 60),
wform(floor($diff % 60), "секунда", "секунды", "секунд")
)
);
?>
L.P.M. , Nuclear Snow
здорово, спасиб)
А если не до Нового Года считаем, а до какой-то своей даты? Что нужно изменить в скрипте?
<?php $diff = mktime(0, 0, 0, 1, 1, 1 + (int) date('Y')) - time(); ?> - высчитывается разница между текущей датой и датой mktime(0, 0, 0, 1, 1, 1 + (int) date('Y')) . mktime возвращает значение в числовом виде для любой даты, вот мануал:
параметры
пример
ru2.php.net/manual/ru/function.mktime.php
ты жесток. можн оже на русском.
так матёрее)