[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Сложение данных многомерного массива
alex_2017
Здравствуйте.
Я плохо разбираюсь в многомерных массивах.
Передо мной стоит следующая задача.
Допустим, есть несколько типов комнат.
Каждая комната может быть свободна или занята.

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, то массив будет выглядеть так:

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 написал(а):
На данный момент у меня генерируется массив с датами.

$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), вводится дата начала и кол-во дней.
Результат - выводятся все типы комнат и наличие мест (общее кол-во мест минус количество забронированных) на каждый из дней.

Для начала я получил массив всех дат выбранных пользователем.
Далее, (чтобы просто посмотреть для начала) вывел единицами и нулями забронированные места на определенные даты.

Я хочу получить массив с типами комнат и этими самыми нулями и единицами.

Или же я пошел совсем не в том направлении?

Спустя 1 час, 11 минут, 34 секунды (23.10.2010 - 11:37) Michael написал(а):
Запрос на выбор занятых комнат должен выглядеть следующим образом:
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 Опередил, но суть та же. smile.gif

Спустя 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
Тогда на выходе должно быть:


Тип комнаты | 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 написал(а):
О, спасибо огромное!
Так будет и правда очень просто.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.