За последние 24 часа нас посетили 53886 программистов и 1762 робота. Сейчас ищут 909 программистов ...

Лист сравнения товаров

Тема в разделе "PHP для новичков", создана пользователем ALEXU, 6 июл 2012.

  1. ALEXU

    ALEXU Активный пользователь

    С нами с:
    5 апр 2011
    Сообщения:
    79
    Симпатии:
    0
    Адрес:
    Russia
    Доброго времени суток.

    Ребята, такой вопрос.
    Делаю сравнение товаров и зашел в тупик.
    Лучше один раз показать, чем описать) Вот картинка http://s017.radikal.ru/i427/1207/11/1cccaeb798ea.gif

    Т.е. сейчас выводится у каждой колонки сравнения и название параметра и его значение.
    При этом, если у одного товара какое-то значение отсутствует, то структура колонок нарушается.

    Из базы тянутся всего два значения: название параметра, значение параметра.
    Код (Text):
    1. $aParam = array();
    2. while ($param = $db->fetch($paramQuery))
    3. {
    4.     $aParam[] = array(
    5.         'pName' => $param['name'],
    6.         'pValue' => $param['value'],
    7.     );
    8. }
    ну и $aParam через Smarty в шаблон передаю.
    т.е. сейчас все банально.

    Подскажите, каким образом реализуется вывод как на картинки внизу?
    Сколько ковырял, так и не понял как реализовать.
     
  2. а где ты берешь характеристики второго товара?
     
  3. ALEXU

    ALEXU Активный пользователь

    С нами с:
    5 апр 2011
    Сообщения:
    79
    Симпатии:
    0
    Адрес:
    Russia
    Ну как. В запросе сразу получаю список товаров которые выбрали для сравнения.
    В $aParam уже полный массив нужных данных для всех выбранных товаров.
    И там делаю сначала цикл самих товаров, а в нем уже цикл из $aParam для вывода параметров.
     
  4. я вот вижу в $aParam только один параметр товара и его имя
     
  5. ALEXU

    ALEXU Активный пользователь

    С нами с:
    5 апр 2011
    Сообщения:
    79
    Симпатии:
    0
    Адрес:
    Russia
    вообще-то это цикл.
    этот код приведен просто для примера. меня интересует сама система построения такого сравнения как на скрине.
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    isset проверит существование члена массива с таким ключем.
     
  7. я понял, но ты для каждого товара (элемента массива) берёшь один параметр. или ты в каждый элемент пихаешь имя??
     
  8. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    я вкурил. код лучше такой:
    Код (PHP):
    1. while ($param = $db->fetch($paramQuery))
    2. {
    3.    $item[$param['name']] = $param['value'];
    4. } 
    потом лучше всего забить фалсами то чего нет в одном, но есть в другом, и отрисовать спокойно по обоим массивам. array_keys() соберет ключи, а array_unique() выкинет дубли. isset проверяем, если такого значения нету - вставляем false
     
  9. ALEXU

    ALEXU Активный пользователь

    С нами с:
    5 апр 2011
    Сообщения:
    79
    Симпатии:
    0
    Адрес:
    Russia
    igordata, сейчас попробую.
     
  10. ALEXU

    ALEXU Активный пользователь

    С нами с:
    5 апр 2011
    Сообщения:
    79
    Симпатии:
    0
    Адрес:
    Russia
    разделить все получилось, спасибо за подсказки!
    только не могу что-то понять как сделать это - забить фалсами то чего нет в одном, но есть в другом
     
  11. пустое значение можно забивать например в базе. "---"
     
  12. ALEXU

    ALEXU Активный пользователь

    С нами с:
    5 апр 2011
    Сообщения:
    79
    Симпатии:
    0
    Адрес:
    Russia
    Это понятно.

    Смотрите.
    У одного товара заполнены 5 параметров, у второго товара заполнено всего 3 параметра.
    А те 2 параметра которые НЕ заполнены в массив и не попадают, так как они НЕ привязаны к второму товару.
    И вот как мне определить какие не заполнены, чтобы забить их пустоту?
    Получается, что нужно сравнивать как-то это все.

    А выборку названий параметров сделал так (правильно ли?)
    Код (Text):
    1. while ($param = $db->fetch($paramQuery))
    2. {
    3.    $item[$param['name']] = $param['value'];
    4.    $itemName[] = $param['name'];
    5. }
    а далее, уже в шаблон
    Код (Text):
    1. $smarty->assign('itemName', array_unique($itemName));
     
  13. один из вариантов - вместо пустоты в базу забивать "---". тобишь при заполнении базы проверяешь на пустоту.
    второй вариант - строишь таблицу нужного размера, а потом в в нужную ячейку забиваешь переменную ...
    ну как то так.
     
  14. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    я ж написал по шагам как. вчитайся.
     
  15. ALEXU

    ALEXU Активный пользователь

    С нами с:
    5 апр 2011
    Сообщения:
    79
    Симпатии:
    0
    Адрес:
    Russia
    Я уже думал на счет этого. Но забивать "---" получится очень накладно по времени. Разница в параметрах у схожих товаров может быть большой.

    В теории я понимаю. А вот реализовать не получается. не могу понять на каком этапе что делать.
     
  16. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    для начала забивай массив так, чтобы ключем было название параметра, а значением - значение =)
     
  17. ALEXU

    ALEXU Активный пользователь

    С нами с:
    5 апр 2011
    Сообщения:
    79
    Симпатии:
    0
    Адрес:
    Russia
    вот смотри.
    У меня два цикла.
    1 - цикл товара
    2 - цикл самих параметров внутри цикла товаров.

    Делаю print_r($item) в цикле товаров и получаю массив
    Код (Text):
    1. Array
    2. (
    3.     [Процессор] => Celeron M / Pentium Dual-Core / Celeron
    4.     [Память] => 2048 Мб
    5.     [Дисплей] => 15.4 дюйм
    6.     [Графический чипсет] => Intel GL960
    7.     [Жесткий диск] => 160...250 Гб
    8.     [Аккумулятор] => Li-Ion
    9.     [Вес] => 2.7 кг
    10. )
    11. Array
    12. (
    13.     [Процессор] => Celeron M / Core Solo
    14.     [Память] => 512...1024 Мб
    15.     [Графический чипсет] => SiS Mirage 3
    16.     [Жесткий диск] => 80...120 Гб
    17.     [Аккумулятор] => Li-Ion 2-3 часа
    18.     [Вес] => 2.7 кг
    19. )
    Как видно, у последнего параметра нет Дисплей.

    Если Выше цикла параметров убираю $item = array();, то тогда Дисплей появляется почему-то. видимо из предыдущего массива берется.
    И вот, что с этим все делать я понять и не могу)
     
  18. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Прежде, чем начать вывод - нужно определить, какие параметры вообще будут (у всех товаров) на данной странице. Пройдись циклом по всему массиву, который получил от б.д., и собери в ещё один отдельный массив названия параметров, но не добавляй одинаковые. Список названий параметров делай по этому новому массиву.
    Ты знаешь теперь, какие параметры и в какой последовательности у тебя написаны, так что выводи параметры товаров опять-таки опираясь на этот массив новый - при выводе параметров каждого товара проходись по нему и смотри, есть ли у текущего товара такой параметр. Ну и отображай соответствующую надпись.
     
  19. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    чувак, возьми бумажку, распиши по шагам.
     
  20. ALEXU

    ALEXU Активный пользователь

    С нами с:
    5 апр 2011
    Сообщения:
    79
    Симпатии:
    0
    Адрес:
    Russia
    Сколько не пробовал, ничего не выходит - не понимаю как правильно написать код. точнее как сделать сравнение, чтобы пустые значения забить ---
     
  21. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    епт.

    На пустоту проверяли?
     
  22. ALEXU

    ALEXU Активный пользователь

    С нами с:
    5 апр 2011
    Сообщения:
    79
    Симпатии:
    0
    Адрес:
    Russia
    Вот не пойму как раз как проверить. Как пройтись по массивам и вычислить расхождения, чтобы забить пустые значения ---
     
  23. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Код (PHP):
    1. <?php
    2. // Массив товаров
    3. $arr = array(
    4.     array(
    5.         'Процессор' => 'Celeron M / Pentium Dual-Core / Celeron',
    6.         'Память' => '2048 Мб',
    7.         'Дисплей' => '15.4 дюйм',
    8.         'Графический чипсет' => 'Intel GL960',
    9.         'Жесткий диск' => '160...250 Гб',
    10.         'Аккумулятор' => 'Li-Ion',
    11.         'Вес' => '2.7 кг'
    12.     ),
    13.     array(
    14.         'Процессор' => 'Celeron M / Core Solo',
    15.         'Память' => '512...1024 Мб',
    16.         'Графический чипсет' => 'SiS Mirage 3',
    17.         'Жесткий диск' => '80...120 Гб',
    18.         'Аккумулятор' => 'Li-Ion 2-3 часа',
    19.         'Вес' => '2.7 кг'
    20.     )
    21. );
    22. $titles = array();
    23. foreach($arr as $item) {
    24.     foreach($item as $param => $value) {
    25.         if(!in_array($param, $titles))
    26.             $titles[] = $param;
    27.     }
    28. }
    29. ?>
    30. <table border="1" cellspacing="0">
    31.     <tr>
    32.         <td>Характеристика</td>
    33. <?php
    34. $cnt = count($arr);
    35. for($i = 0; $i < $cnt; ++$i) {
    36. ?>
    37.         <td>Товар N <?php echo($i); ?></td>
    38. <?php
    39. }
    40. ?>
    41.     </tr>
    42. <?php
    43. foreach($titles as $title) {
    44. ?>
    45.     <tr>
    46.         <td><?php echo($title); ?></td>
    47. <?php
    48.     for($i = 0; $i < $cnt; ++$i) {
    49.         $val = isset($arr[$i][$title]) ? $arr[$i][$title] : '---';
    50. ?>
    51.         <td><?php echo($val); ?></td>
    52. <?php
    53.     }
    54. ?>
    55.     </tr>
    56. <?php
    57. }
    58. ?>
    59. </table>