Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Функция времени, помогите, мозг взрывается

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Как всегда благодарю Liberty за точный ответ
alxfro
Отправлено: 05 Августа, 2012 - 06:30:29
Post Id



Частый гость


Покинул форум
Сообщений всего: 208
Дата рег-ции: Июль 2011  


Помог: 0 раз(а)




Требуется мне сделать вот такую функцию: на входе массив из указанных дней недели
PHP:
скопировать код в буфер обмена
  1. $arr['1']=1;
  2. $arr['2']=1;
  3. $arr['3']=1;
  4. //где $arr - массив
  5. //$arr[КЛЮЧ] - номер дня недели
  6. //и значение соотвественно 1/0 включен/не включен

также на входе время, например 20,00
где 20 - часы
00 - минуты

Требуется определить ближайший день и неделю из ближайше указанного времени и дня недели из всех указанных дней.

Например, если мы скормили функции понедельник,среда,воскресенье в 20:00, а сегодня четверг 21:43, то она должна вывести:

ближайшее событие в понедельник 20:00.

Также буду рад услышать любые комментарии. К работающим функциям не стесняйтесь указывать либерти кошелек, если таковой у вас имеется. СПАСИБО.
 
 Top
vanicon
Отправлено: 05 Августа, 2012 - 10:21:55
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 808
Дата рег-ции: Янв. 2010  
Откуда: Самара


Помог: 17 раз(а)




Если я правильно Вас понял, то думаю можно сделать так:
1. Сначала переводим даты, которые вы передаете, чтобы узнать самый ближайший к сегодняшнему дню, переводим в unix;
2. Находим разность между сегодняшней датой(также в unix - time) и датами переведенными в unix которые вы передали, где разность самая меньшая тот день и ближе к сегодняшнему дню.

(Отредактировано автором: 05 Августа, 2012 - 10:23:49)



-----
Так было, так есть и так будет
 
 Top
DlTA
Отправлено: 05 Августа, 2012 - 12:10:31
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




alxfro пишет:
Например, если мы скормили функции понедельник,среда,воскресенье в 20:00, а сегодня четверг 21:43, то она должна вывести:

ближайшее событие в понедельник 20:00.
почему понедельник? получается воскресенье
 
 Top
alxfro
Отправлено: 06 Августа, 2012 - 12:40:11
Post Id



Частый гость


Покинул форум
Сообщений всего: 208
Дата рег-ции: Июль 2011  


Помог: 0 раз(а)




DlTA пишет:
почему понедельник? получается воскресенье

да, точно. но где же функция или хотя бы алгоритм
(Добавление)
vanicon пишет:
Сначала переводим даты, которые вы передаете, чтобы узнать самый ближайший к сегодняшнему дню, переводим в unix;


даты? там не даты, там дни недели - понедельник...воскресенье... и время

требуется узнать ближайшую точку входа, если, сегодня, к примеру, пятница 16:00
 
 Top
Stierus Супермодератор
Отправлено: 06 Августа, 2012 - 13:08:13
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




Цитата:
там не даты, там дни недели - понедельник...воскресенье... и время
понедельник вчера, понедельник через месяц и понедельник через год - разные понедельники, в любом случае сравнивать дату нужно с датой, вы хоть "сам выбери" передавайте - внутри функции оно будет к dateTime переводиться.
 
My status
 Top
alxfro
Отправлено: 09 Августа, 2012 - 10:11:48
Post Id



Частый гость


Покинул форум
Сообщений всего: 208
Дата рег-ции: Июль 2011  


Помог: 0 раз(а)




Stierus пишет:
в любом случае сравнивать дату нужно с датой


$arr[]='Вторник';
$arr[]='Пятница';
$time[]='18:00';

Вот что я имею ввиду - функция должна найти ближайшее событие, к примеру
function ищу_ближайшее_событие($arr,$time)
{
так.. сегодня у нас вторник.. но уже больше 18:00
значит
вернуть надо пятницу 18:00
}

Типа того. Заметьте никаких дат там нет.
 
 Top
EuGen Администратор
Отправлено: 09 Августа, 2012 - 11:10:02
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




PHP:
скопировать код в буфер обмена
  1. function getNearestEvent($rgDays, $sTime)
  2. {
  3.    $sTime    = preg_match('/\:[\d]{2,2}$/', $sTime)?$sTime:$sTime.':00';
  4.    $rgEvents = array_map(function($mItem) use ($sTime)
  5.    {
  6.       $sTime = date('Y-m-d').' '.$sTime;
  7.       if($mItem==date('w'))
  8.       {
  9.          return strtotime($sTime)>time()?strtotime($sTime):strtotime($sTime.' + 1 week');
  10.       }
  11.       else
  12.       {
  13.          return date('w')<$mItem?strtotime($sTime.' + '.($mItem-date('w')).' day'):strtotime($sTime.' + '.(7-date('w')+$mItem).' day');
  14.       }
  15.    }, $rgDays);
  16.    sort($rgEvents);
  17.    return array_shift($rgEvents);
  18. }
  19.  
  20. $rgDays = array(0,2,4,6);
  21. $sTime  = '18:02';
  22.  
  23. $iTime = getNearestEvent($rgDays, $sTime);
  24. //var_dump(date('Y-m-d H:i:s', $iTime));

?


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
alxfro
Отправлено: 09 Августа, 2012 - 17:49:53
Post Id



Частый гость


Покинул форум
Сообщений всего: 208
Дата рег-ции: Июль 2011  


Помог: 0 раз(а)




EuGen пишет:
?


php<5.3 = error, думаю что с этим делать
 
 Top
EuGen Администратор
Отправлено: 09 Августа, 2012 - 18:32:13
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




PHP:
скопировать код в буфер обмена
  1. function getNearestEvent($rgDays, $sTime)
  2. {
  3.    $sTime    = preg_match('/\:[\d]{2,2}$/', $sTime)?$sTime:$sTime.':00';
  4.    $rgEvents = array();
  5.    foreach($rgDays as $mItem)
  6.    {
  7.       $sTime = date('Y-m-d').' '.$sTime;
  8.       if($mItem==date('w'))
  9.       {
  10.          $rgEvents[]=strtotime($sTime)>time()?strtotime($sTime):strtotime($sTime.' + 1 week');
  11.       }
  12.       else
  13.       {
  14.          $rgEvents[]=date('w')<$mItem?strtotime($sTime.' + '.($mItem-date('w')).' day'):strtotime($sTime.' + '.(7-date('w')+$mItem).' day');
  15.       }
  16.    };
  17.    sort($rgEvents);
  18.    return array_shift($rgEvents);
  19. }

?


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
alxfro
Отправлено: 10 Августа, 2012 - 12:04:05
Post Id



Частый гость


Покинул форум
Сообщений всего: 208
Дата рег-ции: Июль 2011  


Помог: 0 раз(а)




Вот так работает отлично! Спасибо! Именно то, что нужно! Гениально.

EuGen пишет:
PHP:
скопировать код в буфер обмена
  1. <?
  2. //1 - понедельник, 7 - воскресенье
  3. function getNearestEvent($rgDays, $sTime)
  4. {
  5.    $sTime    = preg_match('/\:[\d]{2,2}$/', $sTime)?$sTime:$sTime.':00';
  6.    $rgEvents = array();
  7.    foreach($rgDays as $mItem)
  8.    {
  9.       $sTime = date('Y-m-d').' '.$sTime;
  10.       if($mItem==date('w'))
  11.       {
  12.          $rgEvents[]=strtotime($sTime)>time()?strtotime($sTime):strtotime($sTime.' + 1 week');
  13.       }
  14.       else
  15.       {
  16.          $rgEvents[]=date('w')<$mItem?strtotime($sTime.' + '.($mItem-date('w')).' day'):strtotime($sTime.' + '.(7-date('w')+$mItem).' day');
  17.       }
  18.    };
  19.    sort($rgEvents);
  20.    return array_shift($rgEvents);
  21. }
  22.  
  23. $new = getNearestEvent(array(7), '12:00');
  24. echo date('Y-m-d H:i:s', $new)
  25. ?>



Готов отправить вам 10 USD на Liberty Reserve за предоставленную помощь.
 
 Top
EuGen Администратор
Отправлено: 10 Августа, 2012 - 12:07:49
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Да бросьте, не стоит. Потрачено минут 10 моего свободного времени. Я уже давно трачу его здесь не прибыли ради а просвещения для. Успехов.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
alxfro
Отправлено: 10 Августа, 2012 - 12:12:34
Post Id



Частый гость


Покинул форум
Сообщений всего: 208
Дата рег-ции: Июль 2011  


Помог: 0 раз(а)




EuGen пишет:
Да бросьте, не стоит. Потрачено минут 10 моего свободного времени. Я уже давно трачу его здесь не прибыли ради а просвещения для. Успехов.


Спасибо! Вы не представляете себе какую важную ключевую роль сыграет эта маленькая функция.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Напишите за меня, пожалуйста »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB