PHP: про eval и его друзей :-)

Mammoth

Guest
Автор оригинала: Crazy

Я не наблюдаю скрипта с двумя массивами, чтобы это проверить. В приведенном ранее примере массив был один.

Итак, каков будет этот скрипт, если учесть, что верстальщик -- в разных скинах -- может вывести как одним списком, так и по-отдельности?

Каков будет скрипт, если у нас 5 наборов данных и возможны любые комбинации прихотей верстальщика (считаем, что предвилдя уход кодера в отпуск он сразу его попросил все это предусмотреть).
Crazy, придется попросить тебя составить ТЗ, чтобы ты потом не передергивал... Да и твои примеры мы что-то не видели.
 

Crazy

Developer
Автор оригинала: Mammoth Crazy, придется попросить тебя составить ТЗ, чтобы ты потом не передергивал...
Мне придется попросить сменить тон. Условие про ДВЕ последовательности было поставлено сразу. Цитирую: "Мы видим здесь две последовательности, записанные в левой колонке и разделенные отдельной строкой."

Выделил ключевые места фразы. Так передергивание или невнимательное чтения задания?

Да и твои примеры мы что-то не видели.
Ты хочешь убедиться, что задача разрешима на PHP?
 

tony2001

TeaM PHPClub
>Ты хочешь убедиться, что задача разрешима на PHP?
по-моему именно ТЫ в этом хочешь убедиться.

>Я не наблюдаю скрипта с двумя массивами, чтобы это проверить.
>В приведенном ранее примере массив был один.
>Итак, каков будет этот скрипт, если учесть, что верстальщик --
>в разных скинах -- может вывести как одним списком, так и
>по-отдельности?
Марьиванна, что за тон ?
Crazy, ты мне не учитель, я тебе не ученик, думай перед тем как писать.

>Так передергивание или невнимательное чтения задания?
простите, мы не знаем основ ПХП ?
ты не можешь добавить один цикл в скрипт ?
может стоит пойти книжку какую-нить прочесть ?
 

Crazy

Developer
Автор оригинала: tony2001
>Ты хочешь убедиться, что задача разрешима на PHP?
по-моему именно ТЫ в этом хочешь убедиться.
Я хочу... ну то есть хотел взглянуть, как это реализуется в рамках описанной тобой системы шаблонов.


>Я не наблюдаю скрипта с двумя массивами, чтобы это проверить.
Марьиванна, что за тон ?
Доброжелательный. Ты сказал нечто о достоинствах своего скрипта. Я сообщил, что мне трудно судить об этом заочно. Поскольку ты тем не менее не счел нужным этот скрипт показать -- данную тему можно, наверное, считать исчерпанной.

Crazy, ты мне не учитель, я тебе не ученик, думай перед тем как писать.
У меня сложилось впечатление, что ты воспринимаешь данное обсуждение более с эмоциональной, чем с технической точки зрений.

>Так передергивание или невнимательное чтения задания?
простите, мы не знаем основ ПХП ?
ты не можешь добавить один цикл в скрипт ?
В скрипт -- т.е. если в шаблонах допустимы все средства PHP -- элементарно. Это как раз то, к чему я клоню. Сделать же это средствами шаблонов уважаемым собеседникам ПОКА не удалось. Ну или не сочли нужным продемонстрировать.

может стоит пойти книжку какую-нить прочесть ?
Книжки -- они вообще рулез. Но, признаться, столь настойчиво продвигаемый переход на личности не лучшим образом отражается на моем восприятии собеседника.
 

tony2001

TeaM PHPClub
>Я сообщил, что мне трудно судить об этом заочно
А я еще вчера днем сообщил, что мое решение лежит тут:
http://tony2001.narod.ru/crazy
ты посмотрел ? понял ?
не можешь добавить еще один for по аналогии с первым?
или в чем проблема?

>У меня сложилось впечатление, что ты воспринимаешь данное
>обсуждение более с эмоциональной, чем с технической точки
>зрений.
для особо одаренных привожу цитату:
>>Итак, каков будет этот скрипт, если учесть, что верстальщик --
>>в разных скинах -- может вывести как одним списком, так и
>>по-отдельности?
По-моему стоит использовать в общении чуть более уважительный тон вместо тона экзаменатора ("Ну-ну! А если чуть сменить условие?").
С человеком, который не хочет и/или не может понимать то, что ему говорят, неприятно разговаривать, ты, похоже, ничего из нашего разговора не вынес.
Приведи свой вариант, посмотрим способен ли ты на что-нибудь кроме "Итак, каково будет решение?".
 

Crazy

Developer
Автор оригинала: tony2001
>Я сообщил, что мне трудно судить об этом заочно
А я еще вчера днем сообщил, что мое решение лежит тут:
http://tony2001.narod.ru/crazy
ты посмотрел ? понял ?
не можешь добавить еще один for по аналогии с первым?
или в чем проблема?
Я вполне четко озвучил проблему. Проблема -- если вариантов много. Ибо объем кода будет расти как факториал от числа вариантов.

>>Итак, каков будет этот скрипт...
По-моему стоит использовать в общении чуть более уважительный тон вместо тона экзаменатора ("Ну-ну! А если чуть сменить условие?").
У мсье идеосинкразия на слово "итак"? Ok, учту и в разговоре с тобой постараюсь применять его эквиваленты, не вызывающие столь бурной реакции.

ты, похоже, ничего из нашего разговора не вынес.
Из нашего разговоря я вынес одно любопытное наблюдение, которое я озвучу несколько позже. Когда провер, как именно оно отразиться на реальном коде.

Приведи свой вариант, посмотрим способен ли ты на что-нибудь кроме "Итак, каково будет решение?".
Ok. Вот код. Закомменированные строки -- из реального кода. Две стоящие сразу после них -- тестовые (чтобы можно было запустить пример без использования моего энжина):

PHP:
<?php
//global $view;
//$data1 = $view->get("data1");
//$data2 = $view->get("data2");

$data1 = array("Foo","Bar","Buzz");
$data2 = array(111,222,333);

$items = array_map("htmlspecialchars",array_merge($data1,array("---"),$data2));

?>

<table border=1>
  <?php $row=0; foreach($items as $item): ?>
    <?php if (++$row==1): ?>
      <tr valign=top>
        <td><?php echo $item ?></td><td rowspan=<?php echo count($items) ?>">Some comment</td>
      </tr>
    <?php else: ?>
      <tr>
        <td><?php echo $item ?></td>
      </tr>
    <?php endif; ?>
  <?php endforeach; ?>
</table>
 

tony2001

TeaM PHPClub
Crazy:
этот код более читабелен, чем мой и его легче поддерживать?
как насчет смены дизайна?
 

Crazy

Developer
1. Этот код более читабелен.
2. Его легче поддерживать.

Вопрос относительно смены дизайна я, извини, не понял. Этот файл -- весь -- в ведении верстальщика. Он только этим и занимается. Какую именно потенциальную проблему ты имеешь в виду?
 

Mammoth

Guest
Автор оригинала: Crazy

Мне придется попросить сменить тон. Условие про ДВЕ последовательности было поставлено сразу. Цитирую: "Мы видим здесь две последовательности, записанные в левой колонке и разделенные отдельной строкой."
Я тоже только маленько процитирую:

Автор оригинала: Crazy
Каков будет скрипт, если у нас 5 наборов данных и возможны любые комбинации прихотей верстальщика (считаем, что предвилдя уход кодера в отпуск он сразу его попросил все это предусмотреть).
Я просто хотел получить от тебя входы и выходы программы, а также другие значитмые условия выполнения задачи, чтобы не переписывать ее 100 раз.
 

Mammoth

Guest
Автор оригинала: Crazy

[/PHP]
...
$items = array_map("htmlspecialchars",array_merge($data1,array("---"),$data2));
...

...<td rowspan=<?php echo count($items) ?>">Some comment</td>...
[/PHP]
Думаю, если я приведу аналогичные конструкции на Смарти, тебя это не удовлетворит? Вопрос впрочем риторический. Сейчас буду писать по правильному.
 

Crazy

Developer
Ok. Просто расширяем условие задачи с 2 наборов до 5 с учетом пожелания верстальщика "я могу захотеть комбинировать их произвольным образом".

Обрати внимание: мне даже не нужен полный код. Мне нужна основная идея. Пример такой идеи: "пишем функцию, которая принимает на вход произвольное число массивов и формирует на выходе все возможные сочетания (сорри, не помню верный термин из комбинаторики) из этих массивов". Понятно, что это решение неприемлемо по техническим соображениям. :)
 

Crazy

Developer
Автор оригинала: Mammoth

Думаю, если я приведу аналогичные конструкции на Смарти, тебя это не удовлетворит?
Если все это будет именно в файле с шаблоном, то вполне удовлетворит. Я не зверь какой. Я в душе вообще добрый. :)
 

tony2001

TeaM PHPClub
понятно.
разговор окончен, далее я в этой дискусии не участвую - неинтересно говорить с человеком, который тупо стоит на своем даже когда он явно не прав, да еще и регулярно противоречит сам себе.
всем спасибо.
 

tony2001

TeaM PHPClub
>В любом случае благодарю за участие в дискуссии.
и вам того же =)
 

Mammoth

Guest
Ладно, в заключение только скажу несколько слов.

Автор оригинала: Crazy

Если все это будет именно в файле с шаблоном, то вполне удовлетворит. Я не зверь какой. Я в душе вообще добрый. :)
Ну если верстальщик у нас такой умный, что знает ПХП, то и флаг ему в руки - в Смарти есть тег {php} :). Но есть и другие решения...

Например:

на входе - данные в виде array(array(),array(),...,array()).

Решение:
1) Делаем двойной цикл.
2) Начиная со второй последовательности вставляем <tr><td>'---'</td></tr> (перед последовательностью)
3) В самом начале считаем количество элементов в массивах, плюсуем количество последовательностей - 1 и вставляем полученное в rowspan.

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

Есть еще куча вариантов с написанием собственных фич, но так как тема себя уже исчерпала, то говорю всем: давайте пожмем друг другу руки и давайте тему закрывать как уже исчерпавшую себя.
 

Crazy

Developer
Автор оригинала: Mammoth
в Смарти есть тег {php}
О! Смарти делали здравые люди. :) Напомню, ключевую фразу данного направления дискуссии "темплейты с пхп-кодом ? ты уверен, что это можно назвать _темплейтами_ ?".

Итак, мы видим, что для полноценной реализации шаблонного энжина всеж таки необходима возможность задания в шаблонах PHP-кода. :) Так что после объявления о {php} дискуссия действительно подошла к логическому концу. Жаль, что не все до него дошли...

(По описанному тобой решению: сработает. Но получается. IMHO, более громоздко. :) )

Если есть желание продолжить обсуждение шаблонов с точки зрения технологии, то есть еще темы для обсуждения. Озвучить?
 

Crazy

Developer
Шаблоны -- независимо от того, допускают ли они использование PHP-кодов -- можно разделить на следующие группы:

1. Исполняемые непосредственно PHP-энжином (приведенный мной вариант).
2. Исполняемые энжином, написанным на PHP.
3. Прпеобразуемые (при первом обращении или специальной командой) в код, непосредственно исполняемый PHP.

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

Mammoth

Guest
Кстати по поводу громоздкости:
1) Решаемый пример можно решить по другому. И там это будет гораздо менее громоздко.
2) Приведи пример кода и темплейта, который выводит это:

Код:
<select name="Date_Month">
<option value="1">January</option>
<option value="2">February</option>
<option value="3">March</option>
<option value="4">April</option>
<option value="5">May</option>
<option value="6" selected="selected">June</option>
<option value="7">July</option>
<option value="8">August</option>
<option value="9">September</option>
<option value="10">October</option>
<option value="11">November</option>
<option value="12">December</option>
</select>
<select name="Date_Day">
<option value="1">01</option>
<option value="2">02</option>
<option value="3">03</option>
<option value="4">04</option>
<option value="5">05</option>
<option value="6">06</option>
<option value="7">07</option>
<option value="8">08</option>
<option value="9">09</option>
<option value="10">10</option>
<option value="11">11</option>
<option value="12">12</option>
<option value="13">13</option>
<option value="14">14</option>
<option value="15">15</option>
<option value="16">16</option>
<option value="17">17</option>
<option value="18">18</option>
<option value="19">19</option>
<option value="20">20</option>
<option value="21" selected="selected">21</option>
<option value="22">22</option>
<option value="23">23</option>
<option value="24">24</option>
<option value="25">25</option>
<option value="26">26</option>
<option value="27">27</option>
<option value="28">28</option>
<option value="29">29</option>
<option value="30">30</option>
<option value="31">31</option>
</select>
<select name="Date_Year">
<option value="2002" selected="selected">2002</option>
</select><br>
<select name="Time_Hour">
<option value="00">00</option>
<option value="01">01</option>
<option value="02">02</option>
<option value="03">03</option>
<option value="04">04</option>
<option value="05">05</option>
<option value="06">06</option>
<option value="07">07</option>
<option value="08">08</option>
<option value="09">09</option>
<option value="10">10</option>
<option value="11">11</option>
<option value="12">12</option>
<option value="13">13</option>
<option value="14">14</option>
<option value="15">15</option>
<option value="16" selected="selected">16</option>
<option value="17">17</option>
<option value="18">18</option>
<option value="19">19</option>
<option value="20">20</option>
<option value="21">21</option>
<option value="22">22</option>
<option value="23">23</option>
</select>
<select name="Time_Minute">
<option value="00">00</option>
<option value="01">01</option>
<option value="02">02</option>
<option value="03">03</option>
<option value="04">04</option>
<option value="05">05</option>
<option value="06">06</option>
<option value="07">07</option>
<option value="08">08</option>
<option value="09">09</option>
<option value="10">10</option>
<option value="11">11</option>
<option value="12">12</option>
<option value="13">13</option>
<option value="14">14</option>
<option value="15">15</option>
<option value="16">16</option>
<option value="17">17</option>
<option value="18">18</option>
<option value="19">19</option>
<option value="20">20</option>
<option value="21">21</option>
<option value="22" selected="selected">22</option>
<option value="23">23</option>
<option value="24">24</option>
<option value="25">25</option>
<option value="26">26</option>
<option value="27">27</option>
<option value="28">28</option>
<option value="29">29</option>
<option value="30">30</option>
<option value="31">31</option>
<option value="32">32</option>
<option value="33">33</option>
<option value="34">34</option>
<option value="35">35</option>
<option value="36">36</option>
<option value="37">37</option>
<option value="38">38</option>
<option value="39">39</option>
<option value="40">40</option>
<option value="41">41</option>
<option value="42">42</option>
<option value="43">43</option>
<option value="44">44</option>
<option value="45">45</option>
<option value="46">46</option>
<option value="47">47</option>
<option value="48">48</option>
<option value="49">49</option>
<option value="50">50</option>
<option value="51">51</option>
<option value="52">52</option>
<option value="53">53</option>
<option value="54">54</option>
<option value="55">55</option>
<option value="56">56</option>
<option value="57">57</option>
<option value="58">58</option>
<option value="59">59</option>
</select>
<select name="Time_Second">
<option value="00">00</option>
<option value="01">01</option>
<option value="02">02</option>
<option value="03">03</option>
<option value="04">04</option>
<option value="05">05</option>
<option value="06">06</option>
<option value="07">07</option>
<option value="08">08</option>
<option value="09">09</option>
<option value="10">10</option>
<option value="11">11</option>
<option value="12">12</option>
<option value="13">13</option>
<option value="14">14</option>
<option value="15">15</option>
<option value="16" selected="selected">16</option>
<option value="17">17</option>
<option value="18">18</option>
<option value="19">19</option>
<option value="20">20</option>
<option value="21">21</option>
<option value="22">22</option>
<option value="23">23</option>
<option value="24">24</option>
<option value="25">25</option>
<option value="26">26</option>
<option value="27">27</option>
<option value="28">28</option>
<option value="29">29</option>
<option value="30">30</option>
<option value="31">31</option>
<option value="32">32</option>
<option value="33">33</option>
<option value="34">34</option>
<option value="35">35</option>
<option value="36">36</option>
<option value="37">37</option>
<option value="38">38</option>
<option value="39">39</option>
<option value="40">40</option>
<option value="41">41</option>
<option value="42">42</option>
<option value="43">43</option>
<option value="44">44</option>
<option value="45">45</option>
<option value="46">46</option>
<option value="47">47</option>
<option value="48">48</option>
<option value="49">49</option>
<option value="50">50</option>
<option value="51">51</option>
<option value="52">52</option>
<option value="53">53</option>
<option value="54">54</option>
<option value="55">55</option>
<option value="56">56</option>
<option value="57">57</option>
<option value="58">58</option>
<option value="59">59</option>
</select>
 
Сверху