Здравствуйте! Есть такая конструкция, используемая для сравнения товаров. Первый столбец - это названия характеристик товара, остальные столбцы - это их значения. Таких характеристик очень много, можно ли как-то облегчить код, или заменить кучу дублирующихся foreach одним? Никак не соображу, как это можно сделать... PHP: $arr = select from table и т.д.... <table> <tr> <td>Цвет</td> <? foreach ($arr as $val) { echo '<td>'.$val['color'].'</td>';}?> </tr> <tr> <td>Количество</td> <? foreach ($arr as $val) { echo '<td>'.$val['count'].'</td>';}?> </tr> <tr> <td>Размер</td> <? foreach ($arr as $val) { echo '<td>'.$val['size'].'</td>';}?> </tr> ... </table>
Например оставить один цикл, а результаты записывать в переменную: PHP: $arr = select from table и т.д.... <? $size=''; $color=''; $count=''; foreach ($arr as $val) { $size .= '<td>'.$val['size'].'</td>'; $color .= '<td>'.$val['color'].'</td>'; $count .= '<td>'.$val['count'].'</td>'; } ?> <table> <tr> <td>Цвет</td> <? echo $color; ?> </tr> <tr> <td>Количество</td> <? echo $count; ?> </tr> <tr> <td>Размер</td> <? echo $size; ?> </tr> ... </table>
Я так делаю: PHP: function createTable(){ //$arr = select from table и т.д.... $result = ""; $result .= '<thead> <tr> <th>Цвет</th> <th>Количество</th> <th>Размер</th> </tr> </thead> <tbody>'; foreach ($arr as $val){ $result .= '<tr>' .'<td>'.$val['color'].'</td>' .'<td>'.$val['count'].'</td>' .'<td>'.$val['size'].'</td>' .'</tr>'; } $result .= '</tbody>'; return $result; }
Спасибо! Cпасибо, но не совсем то. Цвет, количество и размер - это строки первого столбца, а не заголовки столбцов
То что написал Artur_hopf это как вариант, т.е. ты можешь написать собственную функцию. Примерно так: PHP: function($arrParams, $arrData){} В которой: PHP: $arrParams = array('color' => 'Цвет', 'count' => 'Количество', 'size' => 'Размер'); $arrData = (/*$arr = select from table*/) В теле функции у тебя будет 2 foreach. первый будет проходиться по $arrParams и формировать HTML: <td>Количество</td> Второй вложенный в первый и будет делатьто, что далает сейчас: PHP: <? foreach ($arr as $val) { echo '<td>'.$val['size'].'</td>';}?> Начала и конец тела функции обрамляешь HTML: <table> --- Добавлено --- Тут просто возникает вопрос, у тебя : PHP: $val['color'] у тебя имеет одинаковый ключ, а значит из массива будет вытаскиваться одно и тоже значение по этому ключу. Отсюда был вполне логичный ответ с echo
@gw1516 держи, проще уже некуда: PHP: $arrParams = ['color' => 'Цвет', 'count' => 'Количество', 'size' =>'Размер']; $array = [0 =>['color' => 'зеленый', 'count' => '1', 'size' => '10'], 1 =>['color' => 'красный', 'count' => '2', 'size' => '3']]; $result = '<table>'; foreach ($arrParams as $key => $value) { $result .= '<tr>' .'<td>'.$value.'</td>'; foreach ($array as $val) { $result .= '<td>'.$val[$key].'</td>'; } } $result .='</tr></table>'; echo $result; Главное чтоб ключи у твоего массива совпадали с ключами которые ты создашь для параметров.
$result .= '<tr>'.'<td>'.$value.'</td>'; Объясните пожалуйста, для чего нужен выделенный фиолетовым цветом участок кода? Почему не просто <tr><td>'.$value.'</td>? Что дает эта точка? Не совсем понял этот момент
@gw1516 мне просто удобнее свой код так читать =) Структура потому что в html должна быть такая: HTML: <table> <tr> <td> Текст </td> </tr> </table> я стараюсь в php такие вещи с новой строки писать.
Да, это я невнимательно прочитал и написал бредятину))) Можно так: PHP: $result = ['<table><tr>','color' => '<td>Цвет</td>','</tr><tr>','count' => '<td>Количество</td>','</tr><tr>','size' => '<td>Размер</td>','</tr></table>']; foreach($arr as $value) { $result['color'] .= '<td>'.$value['color'].'</td>'; $result['count'] .= '<td>'.$value['count'].'</td>'; $result['size'] .= '<td>'.$value['size'].'</td>'; } echo implode($result); Или так: PHP: $format = '<table><tr><td>Цвет</td>%s</tr><tr><td>Количество</td>%s</tr><tr><td>Размер</td>%s</tr></table>'; $result = []; foreach($arr as $value) { $result['color'] .= '<td>'.$value['color'].'</td>'; $result['count'] .= '<td>'.$value['count'].'</td>'; $result['size'] .= '<td>'.$value['size'].'</td>'; } echo sprintf($format, $result['color'], $result['count'], $result['size']);
При добавлении нового значения придется переписывать весь код. К примеру (на основе того когда который написал Artur_hopf) я дернул из базы и получил 2 массива, сравнил их по длине параметров если в первом и втором count() не равны PHP: if( count($arrParams) !== count($array[0]) ) /* сообщаем об этом или выводим пустую таблицу */ т.е. я оперирую только получаемыми данными, а у тебя получается нужно лезть в код и править его полностью. А если таких параметров будет 20-30. Это сегодня заказчику нужно 3 параметра, а завтра 5, после завтра еще 7 и т.д.
Ну это пример. Но тебе в любом случае нужно будет лезть в код и прописывать название параметров, например.
Ну если только как пример. Зачем? Если к примеру у меня БД в которой уже есть данные и в ней будут прописаны: PHP: 'color'=>'Цвет','count'=>'Количество','size'=>'Размер' если нужно что-то расширить, то просто в БД добавится графы PHP: 'price' => 'цена', 'weight' => 'вес' и добавить таблицу в БД с значениями цены и веса. Затем просто отдать скрипту полученные из БД массивы. Ну или просто даже без БД, сами массивы с данными можно вынести в отдельный файл и работать с ними там.