Нарисовать дом на PHP с правильной нумерацией

Cramac

Новичок
Всем привет.
Хочу схематично нарисовать на ПХП дом, кол-во подъездов и квартир на этаже значения переменны.

Кое что получилось, но к верх ногами, т.е. идет с 1 этаж на верху, 9 в низу, а надо наоборот.

Вот что у меня получилось:
PHP:
echo '<center><table border="1" width="80%"><form method="POST" action=""><tr>';
$kvnum[0]=1;

for ($q=1;$q<=$podezd;$q++)
	{
	$kvnum[$q]=$kvnum[$q-1];
	echo '<td>';
	
	for ($i=1;$i<=$etag+1;$i++)
		{
		if ($i==$etag+1)
			{
			echo '
			<table border="0" width="100%" cellspacing="0" cellpadding="0" style="border-top-color: red; border-top-style: dotted; border-top-width: 1px; ">
				<tr>
					<td width="40%" style="border-right-color: red; border-right-style: dotted; border-right-width: 1px;">Колво квартир <input type="text" name="pl_'.$q.'" size="5"></td>
					<td width="20%" align="center">Лесенка <input type="submit" value="save" name="B1"></td>
					<td width="40%" align="right" style="border-left-color: red; border-left-style: dotted; border-left-width: 1px;">Колво квартир <input type="text" name="pr_'.$q.'" size="5"></td>
				</tr>
			</table>
			';
			}
		else
			{
			echo '<table border="0" width="100%" cellspacing="0" cellpadding="0"  style="border-top-color: red; border-top-style: dotted; border-top-width: 1px; padding-top: 10px;">';
			echo '<tr><td width="40%" style="border-right-color: red; border-right-style: dotted; border-right-width: 1px; padding-right: 10px;">';
	
			for ($a=1;$a<=$kvartir["pl_".$q];$a++)
				{
				echo '<input type="text" name="kv_left_'.$i.'_'.$a.'" value="'.$kvnum[$q].'" size="1">';
				$kvnum[$q]++;
				}
		
			echo '</td><td width="20%" align="center">Лесенка этаж '.$i.'</td>';
			echo '<td width="40%" style="border-left-color: red; border-left-style: dotted; border-left-width: 1px; padding-left: 10px;">';
			
			for ($a=1;$a<=$kvartir["pr_".$q];$a++)
				{
				echo '<input type="text" name="kv_righ_'.$i.'_'.$a.'" value="'.$kvnum[$q].'" size="1">';
				$kvnum[$q]++;
				}
		
			echo '</td></tr></table>';		
			}
		}

	
	echo "</td>";
	}
echo "</form></tr></table></center>";
 

Cramac

Новичок
суть вопроса, в частности, как нумерацию квартир сделать с верху в низ и в правильном порядке (т.е. с лева на право) сейчас у меня с 1 начинается и ++ по мере роста дома....

наглядно что получается сейчас

нужно как бы перевернуть с ног на голову
 

WMix

герр M:)ller
Партнер клуба
а давай без домов голыми цифрами?

для начала определим переменные
всего_квартир_в_подьезде = колво_квартир_на_этаже * колво_этажей;
последняя_квартира_в_подьезде = подьезд*всего_квартир_в_подьезде

дальше тотже трик как и с этажами, цикл наоборот от всего_квартир_в_подьезде до 0, уменьшая на еденицу
 

Cramac

Новичок
думал и про это, но как его построить тогда?
пробовал по подъезду делать, с верху в низ, но получится что последняя квартира у меня с лева, а должна быть с права:
36 | 35 | 9 | 34 | 33
32 | 31 | 8 | 30 | 29
т.е. получится зеркальная противоположность.
А надо чтоб было так:
33 | 34 | 9 | 35 | 36
29 | 30 | 8 | 31 | 32
 

WMix

герр M:)ller
Партнер клуба
PHP:
$entrances = 4;
$floors = 9;
$rooms_floor = 4;

echo '<pre>';
for( $floor=$floors; $floor>0; $floor-- ){
	echo $floor.'. | ';
	for( $entrance=1; $entrance<=$entrances; $entrance++ ){

		$last_room = $floor*$rooms_floor + ($entrance-1)*$rooms_floor*$floors;

		echo sprintf('%3s', $last_room-3)  .' | ';
		echo sprintf('%3s', $last_room-2)  .' | ';
		echo sprintf('%3s', $last_room-1)  .' | ';
		echo sprintf('%3s', $last_room)    .' |#| ';
	}
	echo "\n";
}
echo '</pre>';
 

WMix

герр M:)ller
Партнер клуба
и так думал, но в доме может быть по 3 на этаже, по 10
вот только не ври себе сам! ты комнаты расставить не мог!

PHP:
$rooms_floor = 3;
...
//echo sprintf('%3s', $last_room-3)  .' | ';
дальше сам.... у тебя по алгоритму леснечная площадка которая никак не дефинированна для 3 или 10 квартир,

а без неё просто еще один внутренний цикл с переменной $rooms_floor!
 

iceman

говнокодер
засунь ХТМЛ каждого этажа в массив и потом пробежись по нему, с верху вниз.
 

Baton

Новичок
Уважаемый, если у Вас сложная структура массива, то ее нужно сгенерировать вручную. Я бы так и сделал и хранил этот массив в переменной, ну типа:

PHP:
//дом1
$house1 = array(
   //1й подъезд
   1 => array( 
      //1й этаж
      1 => array(4,3,2,1), //4 квартиры 
      //2й этаж
      2 => array(5,6,7), //3 квартиры
      ...,
   ),
   ...
);
А после уж парсинг в хтмл.

А Вы пытаетесь циклами создать этот массив, зачем? Это же сама по себе информация о строении дома. С помощью for() и chr() можно и "hello, world" вывести, но так ведь не делают.
 

Cramac

Новичок
Спасибо, Baton по вашему принципу пошел, все получилось как задумано...
 

Cramac

Новичок
Вот что получилось. Осталось придумать как динамически сделать возможность смещение квартир, т.е. если на первом этаже нет пары квартир, сместить все дальше

PHP:
echo '<center><table border="1" width="80%"><form method="POST" action=""><tr>';

for ($q=1;$q<=$podezd;$q++)
	{
	$kolvokvartirvpod=($kvartir["pl_".$q]+$kvartir["pr_".$q])*$etag;
	$last_kvart=$house[$q-1]["lastkvartira"]+$kolvokvartirvpod;
	
	$house[$q]["kolvokvartir"]=$kolvokvartirvpod;
	$house[$q]["lastkvartira"]=$last_kvart;
	$house[$q]["pervkvartira"]=$house[$q-1]["lastkvartira"]+1;
	$house[$q]["kolvokvartirl"]=$kvartir["pl_".$q];
	$house[$q]["kolvokvartirr"]=$kvartir["pr_".$q];
	echo '<td>';

		for ($i=$etag;$i>0;$i--)
		{
		$pervayanaetage=(($house[$q]["kolvokvartirl"]+$house[$q]["kolvokvartirr"])*$i)-($house[$q]["kolvokvartirl"]+$house[$q]["kolvokvartirr"]);

		$house[$q][$i]["pervayanaetagel"]=$house[$q]["pervkvartira"]+$pervayanaetage;
		$house[$q][$i]["poslednnaetagel"]=$house[$q][$i]["pervayanaetagel"]+$house[$q]["kolvokvartirl"];
		$house[$q][$i]["pervayanaetager"]=$house[$q]["pervkvartira"]+$pervayanaetage+$house[$q]["kolvokvartirl"];
		$house[$q][$i]["poslednnaetager"]=$house[$q][$i]["pervayanaetager"]+$house[$q]["kolvokvartirr"];
		

			echo '<table border="0" width="100%" cellspacing="0" cellpadding="0"  style="border-top-color: red; border-top-style: dotted; border-top-width: 1px; padding-top: 10px;">';
			echo '<tr><td width="40%" style="border-right-color: red; border-right-style: dotted; border-right-width: 1px; padding-right: 10px;">';
	
	
			for ($a=$house[$q][$i]["pervayanaetagel"];$a<$house[$q][$i]["poslednnaetagel"];$a++)
				{
					echo '<input type="text" name="kv_left_'.$i.'_'.$a.'" value="'.$a.'" size="1">';
				}
		
			echo '</td><td width="20%" align="center">Лесенка этаж '.$i.'</td>';
			echo '<td width="40%" style="border-left-color: red; border-left-style: dotted; border-left-width: 1px; padding-left: 10px;">';
			
			for ($a=$house[$q][$i]["pervayanaetager"];$a<$house[$q][$i]["poslednnaetager"];$a++)
				{
					echo '<input type="text" name="kv_righ_'.$i.'_'.$a.'" value="'.$a.'" size="1">';
				}
		
			echo '</td></tr></table>';		

		}
			echo '
			<table border="0" width="100%" cellspacing="0" cellpadding="0" style="border-top-color: red; border-top-style: dotted; border-top-width: 1px; ">
				<tr>
					<td width="40%" style="border-right-color: red; border-right-style: dotted; border-right-width: 1px;">Колво квартир <input type="text" name="pl_'.$q.'" size="5"></td>
					<td width="20%" align="center">Лесенка <input type="submit" value="save" name="B1"></td>
					<td width="40%" align="right" style="border-left-color: red; border-left-style: dotted; border-left-width: 1px;">Колво квартир <input type="text" name="pr_'.$q.'" size="5"></td>
				</tr>
			</table>
			';

	echo "</td>";
	}

echo "</form></tr></table></center>";
 

WMix

герр M:)ller
Партнер клуба
Baton
а ты будешь в базе номера квартир держать? мне вот интересно, как ты собираешься рисовать админку, все квартиры на каждый этаж и подьезд вводить?
 

Baton

Новичок
А надо ли тут админку рисовать? Дома проектируются один раз и держать модель в коде не такая уж и плохая идея, т.к. модель не изменяется.

Но если потребуется хранить именно эту модель в бд, я бы завел 2 таблицы:

home: id, title, ...

flat: id, homeID, entrance, stage, title, ...

Таблиц для подъездов и этажей я бы не заводил.

Но все зависит от потребностей. Например поставлена задача автоматически выставлять стоимость квартиры в зависимости от этажа. Значит этаж - это тоже сущность, создаем таблицу. А еще я видел дома где половина выполнена из монолита, а другая половина из блоков, монолит дороже, след-но стоимость квадратного метра на одинаковых этажах но разных подъездах будет различаться. Значит подъезд это тоже сущность, заводим таблицу для подъездов. Итого получается уже 4 таблицы а не 2. Думаю достаточно фантазировать.

ЗЫ: даже 5 таблиц прослеживатся - price: homeID, entranceID, stageID, price. Вот она нормализация во всей "красе", а можно просто хранить стоимость метра в таблице flat и спокойно жить с 2 таблицами.
 

WMix

герр M:)ller
Партнер клуба
мне как раз хочется пофантазировать на эту темы, кстати даже не думал о реалторском бизнесе, тоже интересно, мне представился cityмap от гуглов..

я заметил, что Cramac пишет $house[$q], подразумевается несколько домов, глядя на screenshot, вижу больше backend и вопрос не про колличество таблиц, а про сам интерфейс..
PHP:
//дом1
$house1 = array(
   //1й подъезд
   1 => array( 
      //1й этаж
      1 => array(4,3,2,1), //4 квартиры 
      //2й этаж
      2 => array(5,6,7), //3 квартиры
      ...,
   ),
   ...
);
больше на view похоже, соглашусь прикольно обьяснил,

но в базе то верняк лучше правило держать, что "в доме 45 обнинской планировки в 3м подьезде, 3 квартиры на этаже 5". тоесть противополужную твой модели.. и на основе этих правил генерить твою
конечную модель?...
 

Cramac

Новичок
в базе хранится каждый дом по отдельности и админка есть, и все нормально хранится. Только как и писал выше, задача теперь по среди дома "вырезать" несколько квартир и чтоб какой нить яваскрипт пересчитал номера.
 
Сверху