Оптимальность такого подхода к MySQL+Smarty

-faqer-

Я только учусь
Оптимальность такого подхода к MySQL+Smarty

Только начинаю со смрти. Ничего сложного не вижу. Это пугает:)
Меня интересует насколько оптимален первый найденный мной метод выведения выборки через шаблон.

В программной части
$rows = mysql_query (...);
$result = array ();
while ($row = mysql_fetch_array ($rows)) {
$result [] = $row;
}

$smarty->assign("result",$result);


В шаблоне

{section name=r loop=$result}
name: {$result[r].name}<br>
city: {$result[r].city}<hr>
{/section}

Данный метод перенесен непосредственно из файла демки. Понимаю, что можно при помощи foreach.

Есть какие-то принципиально другие методы.

Меня больше всего беспокоит то, что посути дважды продится масив
Сначала он формируется и з результата запроса. Потом По нему проходятся с шаблоном. Как я понимаю в Smarty нет функции, которая сама пройдется по $rows
 

kvf77

Red Devil
Ты не должен этого хотеть.
Ты, я так понимаю, решил использовать шаблоны для того, чтобы упростить себе жизнь и отделить код PHP от вывода данных, тогда зачем переносить работу с базой в шаблон?
 

alexhemp

Новичок
еще проще так

$rows = mysql_query (...);
while ($row = mysql_fetch_array ($rows)) {
$smarty->append("result",$row);
}


в шаблоне foreach - синтаксис проще чем section.
 

Demiurg

Guest
alexhemp
чем проще то ? и проще - не значит лучше.
 

Sizz

Новичок
alexhemp, те же яйца только сбоку. массив все равно 2 раза обрабатывается.
 

alexhemp

Новичок
Sizz
А я разве говорил что не те-же яйца? Это одно и то-же только короче.

Demiurg
Массив копируется, расход памяти в моем варианте чуть меньше. :) Но основное достоинство - ненамного короче код, нет лишней переменной.
 

Demiurg

Guest
alexhemp
на счет копирования массива, мне кажется ты ошибаешься.
в php обычно без необходимости память не копируется.
 

Serguitar

Новичок->продвинутый
alexhemp
Да и в мануале написано КАК передавать переменные в таком случае. Как раз в примере с section.
-faqer-
Твой подход имхо, правильный, разве что я бы передавал на твоём месте не весь многомерный массив, полученный путём mysql_fetch_array, а его элементы, что имхо, правильнее.
Т.е.
PHP:
$rows = mysql_query (...);
$result = array ();
$result2=array();
while ($row = mysql_fetch_array ($rows)) {
$result [] = $row['id']; 
$result2[]=$row['name'];
}

$smarty->assign("id",$result);
$smarty->assign("name",$result);
 

Demiurg

Guest
Serguitar
с такими данными очень неудобно работать ..
 

Serguitar

Новичок->продвинутый
Demiurg
Не всегда. Я делаю подобный вывод в том случае, если в section шаблона выводится большое колличество элементов подмассива.
А как удобнее в данном случае?
 

alexhemp

Новичок
Demiurg

При передаче в assign и append - копируется. Ну разве что в php есть какая-нить крутая оптимизация, учитывающая число ссылок на объект и дублирующая только при изменении данных.

В любом случае накладные расходы на это ничтожны по сравнению с весом самого смарти :)

Опять-же я лишь рассказал как мне удобнее. При прочих равных предпочитаю более короткий и ясный код.
 

Demiurg

Guest
>А как удобнее в данном случае?
массив массивов. Удобство состоит в том, что логический объект находится в одном месте а не разбросан по куче массивов.

>Ну разве что в php есть какая-нить крутая оптимизация, учитывающая число ссылок на объект и дублирующая только при изменении данных.
естественно есть, это называется copy on write.
 

alexhemp

Новичок
Demiurg

Ну замечательно, тогда получается мой вариант просто короче по коду :)
 
Сверху