Я поставлен в тупик о том, как идти о проверке, чтобы увидеть, если несколько * дата / время значение -ranges- (означает: начало а также время окончания) находятся в конфликте друг с другом.
Резюме & образцы данных, с которыми мне нужно работать.
У меня есть таблица (app) событий, которая используется для создания формы, через которую пользователь должен пройти и отметить (флажки) все сессии / события, которые он посетил.
Имена флажков генерируются с использованием информации о сеансе. (время начала / окончания месяца / дня вместе с идентификатором сеанса)
т.е.: часы_9_5_p02_800_845
9 = month
5 = date
p02 = session id/event code
800 = start time
845 = end time
все разделены подчеркиванием («_»)
Если пользователь проверяет (и отправляет) несколько сеансов, многие из этих значений будут проверяться на наличие конфликта времени.
hours_9_5_p08_755_800
hours_9_5_p02_800_845
hours_9_5_p02_800_855
hours_9_5_p03_800_845
hours_9_5_p04_820_835
hours_9_5_p04_845_900
hours_9_5_REG_900_915
hours_9_5_REG_1300_1305
hours_9_5_REG_1310_1335
hours_9_5_REG_1320_1335
Выше приведен пример списка полей / массива, который я «мог» получить в качестве выбора / представления пользователя, который мне нужно проверить на возможные конфликты (очевидно, пользователь не может быть в двух местах одновременно) 🙂 А в приведенном выше есть много / выбрано несколько перекрывающихся точно одинаковых временных интервалов.
** Я открыт либо для PHP (проверка после отправки пользователем), либо для javascript / jQuery (если он может выполнять проверку конфликта ДИАПАЗОНА дата / время, может быть легче выделить эти строки / элементы на странице, если сделать это на передний конец)
Я хотел бы изобразить, во-первых, вам нужно проанализировать имена / строки этих флажков из массива fieldlist …
что я сделал так: (php)
function conflictParse($delimiter, $targetString){
//echo 'fired';
$breakDown = explode($delimiter, $targetString);
$startTime = substr_replace($breakDown[4] , ':', -2, 0);
$endTime = substr_replace($breakDown[5] , ':', -2, 0);
$startString = "$breakDown[1]/$breakDown[2]/2015 $startTime";
$endString = "$breakDown[1]/$breakDown[2]/2015 $endTime";
$startFormat = strtotime($startString);
$endFormat = strtotime($endString);
$start = date('m/d/Y G:i',$startFormat);
$end = date('m/d/Y G:i',$endFormat);
return "Session Times: $start -- $end <br>";
}
echo conflictParse('_','hours_9_5_p02_800_845');
но я не знаю, как использовать этот диапазон даты начала & время окончания проверки НЕСКОЛЬКО другая дата начала / окончания ДИАПАЗОН?
может быть, просто придерживаться наличия конфликта синтаксического анализа / проверки PHP после отправки, а затем вернуть на страницу некоторый массив страницы (оригинальных) имен (для некоторого jQuery, чтобы использовать и выделить элементы … и т. д. (но я могу разобраться с этим аспектом позже ..) на данный момент мне нужна помощь о том, как я могу проверить вышеуказанные значения начала / конца диапазона «дата / время», проверенные на конфликты с другими значениями диапазона начала / конца «дата / время»
Обновить:
Вот текущий вложенный ассоциативный массив, с которым мне нужно работать для сравнения:
Array (
[0] => Array (
[id] => hours_9_9_p02_800_845
[fullStart] => 09/09/2015 8:00
[fullEnd] => 09/09/2015 8:45
[month] => 9
[date] => 9
[session_code] => p02
[start] => 8:00
[end] => 8:45
[hasConflict] => false
)
[1] => Array (
[id] => hours_9_9_p02_800_855
[fullStart] => 09/09/2015 8:00
[fullEnd] => 09/09/2015 8:55
[month] => 9
[date] => 9
[session_code] => p02
[start] => 8:00
[end] => 8:55
[hasConflict] => false
)
[2] => Array (
[id] => hours_9_9_p03_800_845
[fullStart] => 09/09/2015 8:00
[fullEnd] => 09/09/2015 8:45
[month] => 9
[date] => 9
[session_code] => p03
[start] => 8:00
[end] => 8:45
[hasConflict] => false
)
[3] => Array (
[id] => hours_9_9_p04_820_830
[fullStart] => 09/09/2015 8:20
[fullEnd] => 09/09/2015 8:30
[month] => 9
[date] => 9
[session_code] => p04
[start] => 8:20
[end] => 8:30
[hasConflict] => false
)
[4] => Array (
[id] => hours_9_9_p04_845_900
[fullStart] => 09/09/2015 8:45
[fullEnd] => 09/09/2015 9:00
[month] => 9
[date] => 9
[session_code] => p04
[start] => 8:45
[end] => 9:00
[hasConflict] => false
)
[5] => Array (
[id] => hours_9_9_REG_1300_1315
[fullStart] => 09/09/2015 13:00
[fullEnd] => 09/09/2015 13:15
[month] => 9
[date] => 9
[session_code] => REG
[start] => 13:00
[end] => 13:15
[hasConflict] => false
)
[6] => Array (
[id] => hours_9_9_REG_1300_1330
[fullStart] => 09/09/2015 13:00
[fullEnd] => 09/09/2015 13:30
[month] => 9
[date] => 9
[session_code] => REG
[start] => 13:00
[end] => 13:30
[hasConflict] => false
)
)
Мне нужно преобразовать ваши js-функции в PHP и, конечно, использовать переменные fullStart / fullEnd во время сравнения, я думаю .. ??
(но ваша функция все еще сбивает меня с толку, поскольку я вижу ссылки на событие1, событие 2 .. (в соответствии с вашим примером) ..
обновление 2:
Выше мой объект / массив (ассоциативный массив), который я получил, установив несколько флажков и отправив мою форму …
Вот моя попытка преобразовать ваш JS-код в PHP на основе [с некоторыми обновлениями имен переменных]: (и закомментированные строки просто для того, чтобы попытаться получить какой-то вывод)
print_r($conflict_list);
function checkFirst($cf_presX, $cf_presY) {
//$cf_presX['fullStart'] < $cf_presY['fallStart'] ? checkConflict($cf_presX, $cf_presY) : checkConflict($cf_presY, $cf_presX);
echo 'Pres Check: '.$cf_presX[0] . '<br>';
echo 'Pres Check: '.$cf_presY[0] . '<br>';
/*
function checkConflict ($cc_presX, $cc_presY) {
if ($cc_presX.['fullEnd'] > $cc_presY.['fullStart']) {
$cc_presX.['hasConflict'] = true;
$cc_presY.['hasConflict'] = true;
}
}
*/
}
function setConflicts($events) {
for ($i = 0; $i < count($events); $i++) {
for ($j = 0; $i < count($events); $j++) {
// if it is not the same event
// if (i !== j) is the same $age['Peter']
if ($events[$i]['id'] !== $events[$j]['id']) {
checkFirst($events[$i], $events[$j]);
}
}
}
}
setConflicts($conflict_list);
Я просто продолжаю получать цикл с неопределенным смещением: (считая до отметки 100k +)
Примечание: неопределенное смещение: 0 в
C: \ wamp \ www \ projects \ misc \ threat_check_new.php в строке 49 Pres
Проверьте:Примечание: неопределенное смещение: 0 в
C: \ wamp \ www \ projects \ misc \ конфликт_check_new.php в строке 50 Pres
Проверьте:Примечание: неопределенное смещение: 0 в
C: \ wamp \ www \ projects \ misc \ threat_check_new.php в строке 49 Pres
Проверьте:
Та же логика может применяться в PHP, но при условии, что вы можете вывести свои события в JavaScript и создать массив объектов с датами начала и окончания, например, так:
var events = [
{
id: 'event1',
start: new Date('1/1/1 5:00'),
end: new Date('1/1/1 6:00'),
hasConflict: false
},
{
id: 'event2',
start: new Date('1/1/1 5:30'),
end: new Date('1/1/1 6:30'),
hasConflict: false
},
{
id: 'event3',
start: new Date('1/1/1 7:30'),
end: new Date('1/1/1 8:30'),
hasConflict: false
}
]
Вы можете сравнить события, чтобы увидеть, имеет ли тот, который начинается первым, время окончания, позднее, чем время начала второго.
function checkFirst (event1, event2) {
event1.start < event2.start
? checkConflict(event1, event2)
: checkConflict(event2, event1)
function checkConflict (first, second) {
if (first.end > second.start) {
first.hasConflict = second.hasConflict = true
}
}
}
Затем вы можете проверить события друг против друга. Вот не очень эффективный, но по крайней мере подходящий цикл:
function flagAllEventsWithConflicts (events) {
events.forEach(event1 => {
events.forEach(event2 => {
event1.id !== event2.id && checkFirst(event1, event2)
})
})
}
Обновить: Вышеуказанная функция также может быть записана как вложенный цикл for:
function flagAllEventsWithConflicts (events) {
for (var i = 0; i < events.length; i++) {
for (var j = 0; j < events.length; j++ {
// if it is not the same event
// if (i !== j) is the same
if (events[i].id !== events[j].id) {
checkFirst(events[i], events[j])
}
}
}
}
Затем проверьте, если hasConflict
верно или неверно:
flagAllEventsWithConflicts(events)
console.table(events)
Других решений пока нет …