Доброго времени суток. Ребята, такой вопрос. Делаю сравнение товаров и зашел в тупик. Лучше один раз показать, чем описать) Вот картинка http://s017.radikal.ru/i427/1207/11/1cccaeb798ea.gif Т.е. сейчас выводится у каждой колонки сравнения и название параметра и его значение. При этом, если у одного товара какое-то значение отсутствует, то структура колонок нарушается. Из базы тянутся всего два значения: название параметра, значение параметра. Код (Text): $aParam = array(); while ($param = $db->fetch($paramQuery)) { $aParam[] = array( 'pName' => $param['name'], 'pValue' => $param['value'], ); } ну и $aParam через Smarty в шаблон передаю. т.е. сейчас все банально. Подскажите, каким образом реализуется вывод как на картинки внизу? Сколько ковырял, так и не понял как реализовать.
Ну как. В запросе сразу получаю список товаров которые выбрали для сравнения. В $aParam уже полный массив нужных данных для всех выбранных товаров. И там делаю сначала цикл самих товаров, а в нем уже цикл из $aParam для вывода параметров.
вообще-то это цикл. этот код приведен просто для примера. меня интересует сама система построения такого сравнения как на скрине.
я понял, но ты для каждого товара (элемента массива) берёшь один параметр. или ты в каждый элемент пихаешь имя??
я вкурил. код лучше такой: Код (PHP): while ($param = $db->fetch($paramQuery)) { $item[$param['name']] = $param['value']; } потом лучше всего забить фалсами то чего нет в одном, но есть в другом, и отрисовать спокойно по обоим массивам. array_keys() соберет ключи, а array_unique() выкинет дубли. isset проверяем, если такого значения нету - вставляем false
разделить все получилось, спасибо за подсказки! только не могу что-то понять как сделать это - забить фалсами то чего нет в одном, но есть в другом
Это понятно. Смотрите. У одного товара заполнены 5 параметров, у второго товара заполнено всего 3 параметра. А те 2 параметра которые НЕ заполнены в массив и не попадают, так как они НЕ привязаны к второму товару. И вот как мне определить какие не заполнены, чтобы забить их пустоту? Получается, что нужно сравнивать как-то это все. А выборку названий параметров сделал так (правильно ли?) Код (Text): while ($param = $db->fetch($paramQuery)) { $item[$param['name']] = $param['value']; $itemName[] = $param['name']; } а далее, уже в шаблон Код (Text): $smarty->assign('itemName', array_unique($itemName));
один из вариантов - вместо пустоты в базу забивать "---". тобишь при заполнении базы проверяешь на пустоту. второй вариант - строишь таблицу нужного размера, а потом в в нужную ячейку забиваешь переменную ... ну как то так.
Я уже думал на счет этого. Но забивать "---" получится очень накладно по времени. Разница в параметрах у схожих товаров может быть большой. В теории я понимаю. А вот реализовать не получается. не могу понять на каком этапе что делать.
вот смотри. У меня два цикла. 1 - цикл товара 2 - цикл самих параметров внутри цикла товаров. Делаю print_r($item) в цикле товаров и получаю массив Код (Text): Array ( [Процессор] => Celeron M / Pentium Dual-Core / Celeron [Память] => 2048 Мб [Дисплей] => 15.4 дюйм [Графический чипсет] => Intel GL960 [Жесткий диск] => 160...250 Гб [Аккумулятор] => Li-Ion [Вес] => 2.7 кг ) Array ( [Процессор] => Celeron M / Core Solo [Память] => 512...1024 Мб [Графический чипсет] => SiS Mirage 3 [Жесткий диск] => 80...120 Гб [Аккумулятор] => Li-Ion 2-3 часа [Вес] => 2.7 кг ) Как видно, у последнего параметра нет Дисплей. Если Выше цикла параметров убираю $item = array();, то тогда Дисплей появляется почему-то. видимо из предыдущего массива берется. И вот, что с этим все делать я понять и не могу)
Прежде, чем начать вывод - нужно определить, какие параметры вообще будут (у всех товаров) на данной странице. Пройдись циклом по всему массиву, который получил от б.д., и собери в ещё один отдельный массив названия параметров, но не добавляй одинаковые. Список названий параметров делай по этому новому массиву. Ты знаешь теперь, какие параметры и в какой последовательности у тебя написаны, так что выводи параметры товаров опять-таки опираясь на этот массив новый - при выводе параметров каждого товара проходись по нему и смотри, есть ли у текущего товара такой параметр. Ну и отображай соответствующую надпись.
Сколько не пробовал, ничего не выходит - не понимаю как правильно написать код. точнее как сделать сравнение, чтобы пустые значения забить ---
Вот не пойму как раз как проверить. Как пройтись по массивам и вычислить расхождения, чтобы забить пустые значения ---
Код (PHP): <?php // Массив товаров $arr = array( array( 'Процессор' => 'Celeron M / Pentium Dual-Core / Celeron', 'Память' => '2048 Мб', 'Дисплей' => '15.4 дюйм', 'Графический чипсет' => 'Intel GL960', 'Жесткий диск' => '160...250 Гб', 'Аккумулятор' => 'Li-Ion', 'Вес' => '2.7 кг' ), array( 'Процессор' => 'Celeron M / Core Solo', 'Память' => '512...1024 Мб', 'Графический чипсет' => 'SiS Mirage 3', 'Жесткий диск' => '80...120 Гб', 'Аккумулятор' => 'Li-Ion 2-3 часа', 'Вес' => '2.7 кг' ) ); $titles = array(); foreach($arr as $item) { foreach($item as $param => $value) { if(!in_array($param, $titles)) $titles[] = $param; } } ?> <table border="1" cellspacing="0"> <tr> <td>Характеристика</td> <?php $cnt = count($arr); for($i = 0; $i < $cnt; ++$i) { ?> <td>Товар N <?php echo($i); ?></td> <?php } ?> </tr> <?php foreach($titles as $title) { ?> <tr> <td><?php echo($title); ?></td> <?php for($i = 0; $i < $cnt; ++$i) { $val = isset($arr[$i][$title]) ? $arr[$i][$title] : '---'; ?> <td><?php echo($val); ?></td> <?php } ?> </tr> <?php } ?> </table>