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. Убил день на написание, уже «прокурил» все виды функций для массивов. Ничего путного не смог написать, мог приводить примеры что писал но это только вас запутает, всеравно это не принесло резульатата. Прошу натолкните на мысль пожалуйста :)
 
а что пользователь помечает таким образом? зачем диапазон нужен?
 
сделай одну кнопку "старт/стоп" безо всяких комбобоксов и пиши в базу время.

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

как организовать базу -- уже другой вопрос.
 
ну и, если без боксов никак, не выводи 8:00, если на часах 12
но секунды писать не надо в любом случае, есть тип datetime, вот его и используй
 
а если обязательно чтоб полный диапазон от 8 до 14, то спрашивай юзера, который выбрал с 10 до 13, а на часах 9 -- уверен, что хочешь через час начать работу? может отметишь с 9 до 10 сначала?
 
нет, все немного не так... пользователь может прийти уже домой часиков так 21:00 и забить данные, что он за день делал, тобишь до этого писал допустим на листочке, а для начальства нужен отчет, вот он сидит и вбивает... а может и вбивать в течении рабочего дня... так вот нужна, страховка от ошибок или лени пользователя вот что-то он далал до обеда, но захочет добавить это потом, а сейчас указать что с 12:00 до 13:00 у него был обед... а остальные данные добьет сегодня или максимум завтра, что программа позволяет сделать... не более.
 
ну тогда показывай ему список уже занесенных интервалов и на попытку добавить новый проверяй, есть ли в базе время попадающее между time_start и time_end, тут еще один плюс хранения в datetime, а не в секундах
 
но, как показывает практика, если человек сразу не отмечает что-то, то потом он это будет делать с бОльшим скрипом и с различными неточностями, а то и вовсе забудет это что-то указать
 
а вообще проще некуда:
начал работать над задачей -- нажал кнопку. закончил -- нажал кнопку. сделал задачу -- нажал кнопку "готово".
и никаких тебе проверок ненужных, диапазонов и прочего геморроя с забывчивостью.

ты не первый, кто с такой штукой сталкивается и ее делает.
 
для забывчивых и ленивых -- поля "я потратил на задачу 1 час три минуты", которые обычно вычисляются автоматически, но в особом случае можно заполнить руками по любой приемлемой схеме.
 
да дело в том что там и для курьеров расчитано.. они то не могут нажать начал работать и закончил)
 
ну тогда показывай ему список уже занесенных интервалов и на попытку добавить новый проверяй, есть ли в базе время попадающее между time_start и time_end, тут еще один плюс хранения в datetime, а не в секундах
за эту схему спасибо буду пробывать :)
 
идея была... в будущем ;)
Основная задача в автоматизации какого-либо учета (бухгалтерского, времени, чего угодно) сотоит не в написании программы обработки данных, как многие ошибочно полагают, а во вводе данных. Если вы не решили проблему ввода данных, то цена всему остальному -- ломанный грош. Поэтому не стоит отодвигать это на будущее.
 
  • Like
Реакции: HEm
Основная задача в автоматизации какого-либо учета (бухгалтерского, времени, чего угодно) сотоит не в написании программы обработки данных, как многие ошибочно полагают, а во вводе данных. Если вы не решили проблему ввода данных, то цена всему остальному -- ломанный грош. Поэтому не стоит отодвигать это на будущее.
согласен с Вами, но так как опыта мало почему-то немогу придумать как еще можно правильно организовать ввод данных, в следствии чего предложить болле альтернативный вариант, сделал точь в точь как хотел заказчик, потом естественно ему каждый раз захотелось еще дополнений. и тут пошло поехало...
 
Понятно, что как исполнитель вы должны делать так, как надо заказчику. Но как дальновидный разработчик, вы должны понимать во что выльется разработка, начатая не с того конца. И я скажу что вам грозит: двух-трехкратный объем работ от начального под видом незначительных доделок. Так тезис "клиент всегда прав" плавно переходит в вопрос выживания в бизнесе. И виноватым здесь будет отнюдь не т.н. "тупой заказчик".
 
Сверху