Главоблъсканица с числа и интервали

heytar

Registered
Ето и задачата:
имаме часове за запазване на стая, през 1 час:
17:30 - 18:30
18:30 - 19:30
19:30 - 20:30
20:30 - 21:30


потребителя може да запази за минимум 2 часа. Пример:
17:30 - 18:30
18:30 - 19:30
19:30 - 20:30
20:30 - 21:30

Тук в червено е запазеното в интервал: 18:30 - 21:30
Тук обаче остава един свободен час (17:30 - 18:30) който трябва вече да може да се запази.

В случая имаме само началния час от колоната - потребителя може да избере само свободен час, трябва според него и вече запазените да изведем в селект възможните часове.
Запазените часове са във формат:
Код:
1830-2130

Още един пример:
17:30 - 18:30
18:30 - 19:30

19:30 - 20:30
20:30 - 21:30

Тук според началния час - 19:30 трябва да му покажем в селект само 21:30.
Ако беше запазено 17:30 - 20:30 трябва да му покажем 21:30 като възможен час.

Аз как се мъча:
разделил съм със
PHP:
$reserveds = explode('-' , $reserved_hours);

$reserved_start[] = $reserveds[0];
$reserved_end[]   = $reserveds[1];
PHP:
$hours = array(1830 => 1830,1930=> 1930,2000=> 2000,2030=> 2030,2100=> 2100,2130=> 2130);
	function between_1213($val, $min, $max) {
		return ($val >= $min && $val <= $max);
	} 
	if(count($reserved_start) > 0) {
		foreach($hours as $hour) {
			$i = -1;
			foreach($reserved_start as $reserved) { $i++; 
				if(between_1213($hour, $reserved, $reserved_end[$i])) {
					unset($hours[$hour]); 
				} 
				 
			}
		}
	}
Но това премахва и часовете които може да се запазят и не виждам как ще го направя според началния час да сравня.
Идеи?
 
Я малко уточнение. Имаш два селекта, в единия задаваш началния час, във втория задаваш крайния час и искаш да сравниш дали разликата има 2ч., за да може да се запази този диапазон. А ако е останал само 1ч. да бъде свободен за запазване независимо критерия?

Съответно искаш запазените диапазони да не се показват повече?

Не разбрах също тази ти логика.

Още един пример:
17:30 - 18:30
18:30 - 19:30
19:30 - 20:30
20:30 - 21:30
Тук според началния час - 19:30 трябва да му покажем в селект само 21:30.
Ако беше запазено 17:30 - 20:30 трябва да му покажем 21:30 като възможен час.

ЕДИТ: Ако първите 2ч. са заети би трябвало двата селекта да се състоят така или иначе от НАЧАЛО: 19:30 и КРАЙ: 21:30.
 
Revelation каза:
Я малко уточнение. Имаш два селекта, в единия задаваш началния час, във втория задаваш крайния час и искаш да сравниш дали разликата има 2ч., за да може да се запази този диапазон. А ако е останал само 1ч. да бъде свободен за запазване независимо критерия?

Съответно искаш запазените диапазони да не се показват повече?

Не разбрах също тази ти логика.

Още един пример:
17:30 - 18:30
18:30 - 19:30
19:30 - 20:30
20:30 - 21:30
Тук според началния час - 19:30 трябва да му покажем в селект само 21:30.
Ако беше запазено 17:30 - 20:30 трябва да му покажем 21:30 като възможен час.

ЕДИТ: Ако първите 2ч. са заети би трябвало двата селекта да се състоят така или иначе от НАЧАЛО: 19:30 и КРАЙ: 21:30.

Да, точно.
Имам само, че не селект а само началния час на резервация.
Трябва според него да покажа в селекет часовете с минимум 2 часа.
Но другото условие ако има само час свободен да може да се запази ме обърква.
 
Защо масива изглежда по този начин?
PHP:
$hours = array(1830 => 1830,1930=> 1930,2000=> 2000,2030=> 2030,2100=> 2100,2130=> 2130);

Не може ли часа да ти е ключ, а дали стаята е резервирана да ти е стойност?
PHP:
$hours = array(1830 => false,1930=> false,2000=> true,2030=> true,2100=> true,2130=> true);

Не знам дали това има нещо общо със задачата, щото абсолютно нищо не разбрах от условието, ама тоя масив щеше да ми избоде очите... :D
 
Ще опитам да обясня оше веднъж:
имаме система за запазване на часове.
Като тия часове са през 1 :
8:30 - 9:30
...
17:30 - 1830
18:30 - 19:30
...
21:30 - 22:30

като след 17:30 минимума за запазване става 2 часа (след това са на по 30 минути - пример за 17:30 показваме: 19:30, 20:00, 20:30 ...).
Но ако примерно някой е запазил в интервал: 18: 30 - 22:00 остава един часа между 17:30 и 18:30 и вече трябва да може да се запази въпреки че е само час.
Така с всички комбинации след 17:30.
Какво имаме ние - часа от който започва резервация (потребителя го избира) и всички запазени часове във формат:
1830-2200 или начален час и краен час. Те са няколко на брой. По тях и часа от който ще се запазва трябва да генерирам селект с възможните часове като спазваме правилото за минимум 2 след 17:30 и другото за запълване на незаетите часове .
 
Нещо от сорта на това:


Код:
<?php


$chasove = array(

	'1230-1330',
	'1330-1430',
	'1430-1530',
	'1530-1630',
	'1630-1730',
	'1730-1830',
	'1830-1930',
	'1930-2030',
	'2030-2130',
	'2130-2230',
	'2230-2330'

	);

$chasove_uslovie = array(

	'1730' => '1730-1930',
	'1830' => '1830-2030',
	'1930' => '1930-2130',
	'2030' => '2030-2230',
	'2130' => '2130-2330',
	'2230' => '2230-0030'

	);


$zaeti_chasove = array(

	'1230-1330',
	'1530-1630',
	'1830-2030',
	'2030-2230'

	);


$zaeti_chasove_2 = array(

	'1230-1330',
	'1530-1630',
	'1730-1930',
	'2030-2230'

	);


$zaeti_chasove_3 = array(

	'1230-1330',
	'1530-1630',
	'1830-2030',
	'2130-2330'

	);



proverka_na_svobodni_chasove($chasove, $chasove_uslovie, $zaeti_chasove);

proverka_na_svobodni_chasove($chasove, $chasove_uslovie, $zaeti_chasove_2);

proverka_na_svobodni_chasove($chasove, $chasove_uslovie, $zaeti_chasove_3);


function proverka_na_svobodni_chasove($chasove, $chasove_uslovie, $zaeti_chasove) {

	foreach($chasove as $chas) {
		$nachalen_kraen_chas = explode('-', $chas);
		$nachalen_chas = $nachalen_kraen_chas[0];
		$kraen_chas = $nachalen_kraen_chas[1];

		// ако дадене стая е запазена
		if(in_array($chas, $zaeti_chasove)) { 

			
			echo "<span style='color: red;'>".$chas."</span><br />"; 
		}

		// ако дадена стая след 1730 е запазена
		elseif(isset($chasove_uslovie[$nachalen_chas]) && in_array($chasove_uslovie[$nachalen_chas], $zaeti_chasove)){

			
			echo "<span style='color: red;'>".$chasove_uslovie[$nachalen_chas]."</span><br />"; 


		}

		// ако дадена стая след 1730 е не е запазена и не може да бъде запазена за 2ч. проверява дали часът-1ч е зает.
		elseif(isset($chasove_uslovie[$nachalen_chas-100]) && in_array($chasove_uslovie[$nachalen_chas-100], $zaeti_chasove)){

			unset($chasove_uslovie[ $nachalen_chas ]);
			
		}

		// ако дадена стая след 1730 е не е запазена и не може да бъде запазена за 2ч. проверява дали часът+1ч е зает.
		elseif(isset($chasove_uslovie[$nachalen_chas+100]) && in_array($chasove_uslovie[$nachalen_chas+100], $zaeti_chasove)){
			
			echo "<span style='color: green;'>".$chas."</span><br />"; 
			unset($chasove_uslovie[ $nachalen_chas ]);
			
		}


		// не запазена стая след 1730
		elseif(isset($chasove_uslovie[$nachalen_chas])){ 

			
			echo "<span style='color: green;'>".$chasove_uslovie[$nachalen_chas]."</span><br />";
		}

		// не запазена стая преди 1730
		elseif($nachalen_kraen_chas[0] <= 1730){ 

			
			echo "<span style='color: green;'>".$chas."</span><br />";
		}
	}

	echo "<hr />";

}
?>
 

Горе