Я плохо разбираюсь в многомерных массивах.
Передо мной стоит следующая задача.
Допустим, есть несколько типов комнат.
Каждая комната может быть свободна или занята.
room1 -> 0
0
0
1
1
room2 -> 0
1
1
1
0
room1 -> 0
0
1
1
0
То есть структура массива, как я понимаю, должна быть следующая:
$array_room['$room_type']['$room_free']
Задача состоит в том, чтобы сложить переменные $room_free при совпающих $room_type.
То есть массив должен приобрести вид:
room1 -> 0
0
1
2
1
room2 -> 0
1
1
1
0
Прошу вашей помощи.
Спустя 7 минут, 38 секунд (23.10.2010 - 07:47) kirik написал(а):
Что это за цифры?
Спустя 5 минут, 44 секунды (23.10.2010 - 07:53) alex_2017 написал(а):
Они обозначают временной интервал.
То есть, допустим, есть интервал 25.03 - 29.03.
Если комната типа room1 будет занята 26.03 - 28.03, то массив будет выглядеть так:
То есть 0 - в этот день свободна, 1 - занята.
То есть, допустим, есть интервал 25.03 - 29.03.
Если комната типа room1 будет занята 26.03 - 28.03, то массив будет выглядеть так:
room1 -> 0
1
1
1
0
То есть 0 - в этот день свободна, 1 - занята.
Спустя 6 минут, 1 секунда (23.10.2010 - 07:59) Michael написал(а):
Так изначальных массива - три (или больше) разных, и надо их состряпать в один?
Спустя 7 минут, 18 секунд (23.10.2010 - 08:06) alex_2017 написал(а):
На данный момент у меня генерируется массив с датами.
$date_start, к примеру, 25.08.2010, а $num_days, например, 3.
Далее
date_end это конец интервала.
В этом цикле, я хочу записать массив, о котором говорил в начале.
$d = explode(".",$date_start);
$t = 0;
for($i = 1; $i <= $num_days; $i++)
{
$da[$t] = date("d.m.Y",mktime (0,0,0,$d[1],$d[0],$d[2]));
$t++;
$d[0]++;
}
$date_start, к примеру, 25.08.2010, а $num_days, например, 3.
Далее
$result = mysql_query("SELECT * FROM reserved WHERE sanatorium = '$hotel'");
while($myrow = mysql_fetch_assoc ($result))
{
$start = 0;
foreach($da as $a)
{
if($a == $myrow['date_start'] or $start == 1)
{
echo '1';
$start = 1;
if($a == $myrow['date_end'])
$start = 0;
}
else
{
echo '0';
}
}
}
date_end это конец интервала.
В этом цикле, я хочу записать массив, о котором говорил в начале.
Спустя 1 час, 24 минуты, 7 секунд (23.10.2010 - 09:30) twin написал(а):
Попов видно не научил, что можно это делать прямо в запросе...
Объясни толком задачу, какие сходные данные и каким должен быть результат. Ты совсем не то делаешь.
Объясни толком задачу, какие сходные данные и каким должен быть результат. Ты совсем не то делаешь.
Спустя 55 минут, 16 секунд (23.10.2010 - 10:25) alex_2017 написал(а):
С Поповым я не знаком.
Делать что?
Есть таблица бд reserved.
В ней поля id, sanatorium, room, date_start, date_end.
id и sanatorium роли не играют.
date_start, date_end (забил пока варчарами) - дата начала и дата конца забронированной комнаты типа room.
Полей, с одинаковым значением room может быть несколько.
В отдельной таблице есть общее кол-во мест для каждого типа комнат room.
В форме выбирается санаторий (sanatorium), вводится дата начала и кол-во дней.
Результат - выводятся все типы комнат и наличие мест (общее кол-во мест минус количество забронированных) на каждый из дней.
Для начала я получил массив всех дат выбранных пользователем.
Далее, (чтобы просто посмотреть для начала) вывел единицами и нулями забронированные места на определенные даты.
Я хочу получить массив с типами комнат и этими самыми нулями и единицами.
Или же я пошел совсем не в том направлении?
Делать что?
Есть таблица бд reserved.
В ней поля id, sanatorium, room, date_start, date_end.
id и sanatorium роли не играют.
date_start, date_end (забил пока варчарами) - дата начала и дата конца забронированной комнаты типа room.
Полей, с одинаковым значением room может быть несколько.
В отдельной таблице есть общее кол-во мест для каждого типа комнат room.
В форме выбирается санаторий (sanatorium), вводится дата начала и кол-во дней.
Результат - выводятся все типы комнат и наличие мест (общее кол-во мест минус количество забронированных) на каждый из дней.
Для начала я получил массив всех дат выбранных пользователем.
Далее, (чтобы просто посмотреть для начала) вывел единицами и нулями забронированные места на определенные даты.
Я хочу получить массив с типами комнат и этими самыми нулями и единицами.
Или же я пошел совсем не в том направлении?
Спустя 1 час, 11 минут, 34 секунды (23.10.2010 - 11:37) Michael написал(а):
Запрос на выбор занятых комнат должен выглядеть следующим образом:
где d1, d2, s - то, что ввел пользователь.
Если к этому запросу прикрутить используя LEFT JOIN таблицу с наличием комнат - все данные можно получить в одном запросе.
SELECT room, count(room)
FROM reserved
WHERE date_start >= d1 AND date_end <= d2 AND sanatorium = s
GROUP BY room
где d1, d2, s - то, что ввел пользователь.
Если к этому запросу прикрутить используя LEFT JOIN таблицу с наличием комнат - все данные можно получить в одном запросе.
Спустя 6 минут, 7 секунд (23.10.2010 - 11:43) twin написал(а):
Цитата |
id и sanatorium роли не играют. |
Это плохо. Должны играть. Это как раз и обуславливает связь между таблицами.
Цитата |
date_start, date_end (забил пока варчарами) |
Это тоже плохо, тип нужно DATE, тогда с ним легче работать.
Ну а теперь по порядку. Ты рассказал, как у тебя сейчас, а теперь расскажи принцип.
По хорошему должно быть примерно так.
1. Таблица со свойствами комнат (я так понимаю, это room)
id | id_parent | type | seats
Здесь просто устнавливаются данные для типов комнат. Сами типы - больше информативная колонка, можно пренебречь. Поле id_parent - для связи таблиц. В него нужно запиывать ID санатория, которому принадлежит комната
2. Таблица санаториев
id | name | другие свойства
3. Таблица резервов (пойдет твоя, только с нормальными типами полей)
Тогда можно делать разнообразные выборки и сортировки, объединяя таблицы JOIN или выбирать данные динамически. Все это гораздо проще делать на стороне MySQL, чем на PHP.
Допустим получить все забронированные комнаты в каком то санатории за определенный период можно таким запросом:
$res = mysql_query("SELECT * FROM reserved a
LEFT JOIN room b ON a.`room` = b.`id_parent`
WHERE b.`id_parent` = 1
AND `date_start` >= '2010-10-23'
AND `date_end` <= '2010-10-23' + INTERVAL 10 DAY"
);
Ну и все остальное в зависимости от требований. Я не совсем понял, что нужно получить, но принцип примерно такой.
В общем тебе стоит плотно поработать с базами данных и SQL запросами. Тогда будет все легко и просто.
Спустя 32 секунды (23.10.2010 - 11:44) twin написал(а):
Michael Опередил, но суть та же.
Спустя 17 минут, 36 секунд (23.10.2010 - 12:01) Michael написал(а):
Я бы еще в таблице reserved добавил все таки поле - кол-во забронированных мест. Т.е. в одной заявке чтобы можно было указать.
Спустя 16 минут, 21 секунда (23.10.2010 - 12:18) alex_2017 написал(а):
Спасибо вам большое за ответы!
Я таки не смог вам правильно объяснить суть, прошу прощения.
Допустим, есть бронь 25.03 - 28.03 и 24.03 - 27.03 на один и тот же тип комнат.
Общее кол-во мест, например, 3 для room1.
Для room2 5 мест, но нет ни одной брони.
Пользователя интересует интервал 23.03 - 29.03
Тогда на выходе должно быть:
Именно поэтому я разбил интервал на массив.
Дико извиняюсь за потраченное время.
Я таки не смог вам правильно объяснить суть, прошу прощения.
Допустим, есть бронь 25.03 - 28.03 и 24.03 - 27.03 на один и тот же тип комнат.
Общее кол-во мест, например, 3 для room1.
Для room2 5 мест, но нет ни одной брони.
Пользователя интересует интервал 23.03 - 29.03
Тогда на выходе должно быть:
Тип комнаты | 23.03 | 24.03 | 25.03 | 26.03 | 27.03 | 28.03 | 29.03
---------------------------------------------------------------------------------------------------
room1 | 3 | 2 | 1 | 1 | 1 | 2 | 3
---------------------------------------------------------------------------------------------------
room2 | 5 | 5 | 5 | 5 | 5 | 5 | 5
Именно поэтому я разбил интервал на массив.
Дико извиняюсь за потраченное время.
Спустя 9 минут, 20 секунд (23.10.2010 - 12:27) twin написал(а):
Тогда тебе таблицу reserved нужно заполнять по числам. Не периодами, а именно по числам.
Тогда выборку сделать еще проще будет.
Тогда выборку сделать еще проще будет.
Спустя 7 минут, 37 секунд (23.10.2010 - 12:35) alex_2017 написал(а):
О, спасибо огромное!
Так будет и правда очень просто.
Так будет и правда очень просто.