array_filter, splice and etc...

Grizli2007

Новичок
Доброго врмени суток! :)

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

Предистория (то что на данный момент сделал):
1) Существует два <select>’а в котором существует диапазон времени к примеру с 08:00 до 14:00.
соответственно в БД заносятся две записи начального времени и окончательного.
2) Далее когда записи добавляются 2-й раз, вычисляется предыдущие максимальное значение конечного времени и допустим выводится в <select> уже к примеру с 09:45 до 14:00, если в бд уже существует время до 09:45
3) Время хранится в секундах :)

Коротка на пальцах, проделываю все следующим образом:
PHP:
//создаю массив для того чтобы в дальнейшем "занести" туда время которое уже есть в БД.
$timelist = array();
//вношу время в цикле
while($row_nar = mysql_fetch_array($result))
    { 
        $timelist[] = $row_nar['finish_time'];
    }
// далее проверяю или есть вообще что-либо в массиве если есть вычисляю максимальное конечное время
if ($timelist[0]!='') 
    {
        $timers = 
    } else {
        //иначе начальную точку ставлю по дефолту $start_time = 1234;
        $timers = $start_time;
    }

// далее в сам <select> вношу то, что получилось... $step = 300;
while ($timer < $finish_time) {
        $timer = $timers;
        echo "<option>".date('H:i',$timer)."</option>";
        $timers = $timers + $step;
        }
В общем, все работает как надо, :) но встал вопрос усовершенствовать.
Что если пользователь ошибся и начал вводить время не с 08:00 часов утра, а допустим с 09:00 и тут уже у нас выпадает целый час с 8 до 9.
И так «серая масса вздрогнулась» открыл я мануалы и начал курить массивы, что в итоге вышло смотрим далее… (вышла печаль)
PHP:
if ($timelist[0]!='') 
        {   //масив всего времени c 8 до 14
            $timelist_all = array();
            $timelist_all = range($start_time, $finish_time, 300);
            //переводим полный массив в часы:минуты , так подумал менее «геморней» чем потом все переводить.. сейчас уже незнаю или правильно сделал
             foreach ($timelist_all as $time_all) {
                $completsecondall = date('H:i',$ time_all);
                $completsecondalls[] = $completsecondall;
            }
	//выдернул значения с массивов $maxt – максимальное в конечном времени и $mins - минимальное в начальном.
            $maxt = max($timelist);
            $mins = min($timestart);
	//создал маленький массив (который «выдергиваю» из целого, чтобы получить нужный)
            $timelist_diff = range($mins, $maxt, 300);
	//перевожу в часы:минуты
foreach ($timelist_diff as $revsecond) {
                $completsecond = date('H:i',$revsecond);
                $completeh[]=$completsecond;
            }
//отнимем из всего масива наш уже существующий $completsecondalls – полный список времени, $completeh – то что уже в БД (хотя и тут дыра есть, но это позже)
            $timerss = array_diff($completsecondalls, $completeh);

//создаем список стартового времени, написано громоздко, потому что дотачивал к старому варианту, можно будет облегчить суть не в этом.
 if ($timelist[0]!='') 
    {
        foreach($timerss as $timesss) {
        echo "<option>". $timesss ."</option>";
        }        
    } else { 
         while ($timer < $finish_time) {
        $timer = $timers;
        echo "<option>".date('H:i',$timer)."</option>";
        $timers = $timers + $step;
        }
    }

//Все выводит норм. Допустим в первом селекте идет диапазон с 8 до 9 потом выдергивается кусок что уже в базе и далее к примеру с 10:00 до 14:00 идет список далее, все как положено.
И так кто осилил весь это бред, задаю вопрос… Как теперь все это заново переписать что бы еще учитывать, чтобы пользователь не «перепрыгивал» диапазон который уже в БД, тобишь если он выберет с 08:00 до 11:00 а в базе уже вбито что он делал сегодня что-то с 9:00 до 10:00. Убил день на написание, уже «прокурил» все виды функций для массивов. Ничего путного не смог написать, мог приводить примеры что писал но это только вас запутает, всеравно это не принесло резульатата. Прошу натолкните на мысль пожалуйста :)
 

Breeze

goshogun
Команда форума
Партнер клуба
а что пользователь помечает таким образом? зачем диапазон нужен?
 

Breeze

goshogun
Команда форума
Партнер клуба
сделай одну кнопку "старт/стоп" безо всяких комбобоксов и пиши в базу время.

старт нажал -- записал в базу "задача №100500, старт 2011-12-17 08:00:00"
стоп нажал -- записал в базу "задача №100500, стоп 2011-12-17 09:12:00"
тут уже можно отчетность разной степени тяжести строить при желании.

как организовать базу -- уже другой вопрос.
 

Breeze

goshogun
Команда форума
Партнер клуба
ну и, если без боксов никак, не выводи 8:00, если на часах 12
но секунды писать не надо в любом случае, есть тип datetime, вот его и используй
 

Breeze

goshogun
Команда форума
Партнер клуба
а если обязательно чтоб полный диапазон от 8 до 14, то спрашивай юзера, который выбрал с 10 до 13, а на часах 9 -- уверен, что хочешь через час начать работу? может отметишь с 9 до 10 сначала?
 

Grizli2007

Новичок
нет, все немного не так... пользователь может прийти уже домой часиков так 21:00 и забить данные, что он за день делал, тобишь до этого писал допустим на листочке, а для начальства нужен отчет, вот он сидит и вбивает... а может и вбивать в течении рабочего дня... так вот нужна, страховка от ошибок или лени пользователя вот что-то он далал до обеда, но захочет добавить это потом, а сейчас указать что с 12:00 до 13:00 у него был обед... а остальные данные добьет сегодня или максимум завтра, что программа позволяет сделать... не более.
 

Breeze

goshogun
Команда форума
Партнер клуба
ну тогда показывай ему список уже занесенных интервалов и на попытку добавить новый проверяй, есть ли в базе время попадающее между time_start и time_end, тут еще один плюс хранения в datetime, а не в секундах
 

Breeze

goshogun
Команда форума
Партнер клуба
но, как показывает практика, если человек сразу не отмечает что-то, то потом он это будет делать с бОльшим скрипом и с различными неточностями, а то и вовсе забудет это что-то указать
 

Breeze

goshogun
Команда форума
Партнер клуба
а вообще проще некуда:
начал работать над задачей -- нажал кнопку. закончил -- нажал кнопку. сделал задачу -- нажал кнопку "готово".
и никаких тебе проверок ненужных, диапазонов и прочего геморроя с забывчивостью.

ты не первый, кто с такой штукой сталкивается и ее делает.
 

Breeze

goshogun
Команда форума
Партнер клуба
для забывчивых и ленивых -- поля "я потратил на задачу 1 час три минуты", которые обычно вычисляются автоматически, но в особом случае можно заполнить руками по любой приемлемой схеме.
 

Grizli2007

Новичок
да дело в том что там и для курьеров расчитано.. они то не могут нажать начал работать и закончил)
 

Grizli2007

Новичок
ну тогда показывай ему список уже занесенных интервалов и на попытку добавить новый проверяй, есть ли в базе время попадающее между time_start и time_end, тут еще один плюс хранения в datetime, а не в секундах
за эту схему спасибо буду пробывать :)
 

С.

Продвинутый новичок
идея была... в будущем ;)
Основная задача в автоматизации какого-либо учета (бухгалтерского, времени, чего угодно) сотоит не в написании программы обработки данных, как многие ошибочно полагают, а во вводе данных. Если вы не решили проблему ввода данных, то цена всему остальному -- ломанный грош. Поэтому не стоит отодвигать это на будущее.
 
  • Like
Реакции: HEm

Grizli2007

Новичок
Основная задача в автоматизации какого-либо учета (бухгалтерского, времени, чего угодно) сотоит не в написании программы обработки данных, как многие ошибочно полагают, а во вводе данных. Если вы не решили проблему ввода данных, то цена всему остальному -- ломанный грош. Поэтому не стоит отодвигать это на будущее.
согласен с Вами, но так как опыта мало почему-то немогу придумать как еще можно правильно организовать ввод данных, в следствии чего предложить болле альтернативный вариант, сделал точь в точь как хотел заказчик, потом естественно ему каждый раз захотелось еще дополнений. и тут пошло поехало...
 

С.

Продвинутый новичок
Понятно, что как исполнитель вы должны делать так, как надо заказчику. Но как дальновидный разработчик, вы должны понимать во что выльется разработка, начатая не с того конца. И я скажу что вам грозит: двух-трехкратный объем работ от начального под видом незначительных доделок. Так тезис "клиент всегда прав" плавно переходит в вопрос выживания в бизнесе. И виноватым здесь будет отнюдь не т.н. "тупой заказчик".
 
Сверху