#php
#php
Вопрос:
Как я могу выделить наибольшее и наименьшее значения в PHP foreach? Вот простой пример, $results — это результаты SQL в массиве. Я хотел бы выделить наибольшее и наименьшее значение с помощью простого css, например, цветом фона.
<h3>Camera </h3>
<table class="table">
<tbody>
<tr>
<td>Rear Camera Megapixel</td>
<?php foreach ($results as $result){ ?>
<td> <strong><?php echo $result['rear_camera']; ?></strong> </td>
<?php } ?>
</tr>
<tr>
<td>Front Camera Megapixel</td>
<?php foreach ($results as $result){ ?>
<td> <strong><?php echo $result['front_camera']; ?></strong> </td>
<?php } ?>
</tr>
</tbody>
</table>
Исходный результат
Ожидаемый результат
Как я могу определить высокое и низкое значение в foreach
. Или я должен сделать это перед передачей данных foreach
?
Комментарии:
1. Если у вас нет машины времени, которая позволяет вам позже повторно изменять уже созданные выходные данные, конечно, вам нужно определить их перед циклом.
2. @Cbro, хорошо, тогда позвольте мне сначала создать машину времени … 😉
3. Покажите нам свои запросы. Почему бы не добавить
MIN()
иMAX()
в ваш sql? В противном случае вам нужно будет повторить наборы результатов с помощьюmin()
иmax()
перед выполнением цикла.
Ответ №1:
Этот код должен работать:
<?php
$results = array(1, 2, 3, 44, 54, 56, 122, 34, 9);
$max_value = max($results);
$min_value = min($results);
foreach($results as $result){
if ($result == $max_value) {
echo '<td style="background-color: green;">'.$result.'</td>';
}
elseif ($result == $min_value){
echo '<td style="background-color: red;">'.$result.'</td>';
}
else{
echo '<td>'.$result.'</td>';
}
}?>
Вы можете легко объединить строку, используя .
вместо того, чтобы писать php снова и снова.
Комментарии:
1. » Попробуйте это » и » Я надеюсь, что это сработает » не являются частью хороших обучающих ответов. Каждый ответ должен быть объяснен с целью обучения и расширения возможностей OP и тысяч будущих исследователей.
2.Зачем любому хорошему разработчику вызывать
$max_value = max($results); $min_value = min($results);
внутри цикла?else if
(в двух словах) является нарушением стандартов кодирования PSR-12.<span>
Теги являются бесполезным раздуванием DOM, добавьте классы к<td>
.3. спасибо за ваш комментарий, я обязательно постараюсь улучшить себя.
Ответ №2:
Никогда не рано начинать обучать пользователя тому, как улучшить его гражданство Stack Overflow. Итак, прежде чем я начну решать этот вопрос, я хочу объяснить, почему ваш вопрос не очень подходит для Stack Overflow.
Вы опубликовали «дамп требований». Вы предоставили некоторые входные данные и ожидаемый результат, но не приложили ни малейших усилий. Я имею в виду, вы показали, что знаете, как выполнять цикл и эхо, но здесь нет ни условного выражения, ни какой-либо попытки сгенерировать минимальные / максимальные значения. Это означает, что вы недостаточно исследовали и попробовали.
Правда в том, что ваш вопрос состоит из нескольких базовых методов (это делает ваш вопрос «Слишком широким / требует большего внимания») — все они будут дублировать вопросы о переполнении стека. Даже если бы в Stack Overflow не было по крайней мере 5 отдельных страниц, посвященных каждому из базовых методов, в руководстве по php было бы достаточно информации для решения этой проблемы.
- Как выделить столбец данных из результирующего набора в плоский массив
- Как найти минимальное и максимальное значение в массиве
- Как условно оформить элемент
Видите ли, если бы вы опубликовали код, чтобы показать, что вы знаете, как успешно выполнить все эти подзадачи, тогда у вас был бы рабочий код. Если у вас есть работающий код, но вы хотите знать, можно ли его доработать, тогда у вас возникает вопрос, который квалифицируется как вопрос о проверке кода.
Если вы столкнулись с одним из базовых методов, перечисленных выше, то вы обязаны выделить точную точку в своем коде, где вы застряли, чтобы ваш вопрос не был «слишком широким». В случае этого конкретного вопроса, если бы вы остановились только на одном из методов, мы могли бы решить ваш вопрос, предоставив дублирующуюся страницу. Это идеально подходит для Stack Overflow, потому что мы можем решить ваш вопрос без создания каких-либо ненужных страниц на веб-сайте (вы выигрываете, выигрывает Stack Overflow, и меньше добровольцев тратят свое время на чтение нового повторяющегося вопроса).
Что касается решения вашего вопроса, будет несколько разных способов достичь того, что вам нужно. Я рекомендую хранить «код обработки» отдельно от «кода отображения». В профессиональных приложениях у вас не было бы кода обработки в том же файле, что и отображаемый код. (Одной из наиболее распространенных / трендовых структур является MVC, где данные собираются в модели, затем подготавливаются и передаются в представление через контроллер.)
Кроме того, вы должны стараться использовать как можно меньше HTML-разметки. Чем меньше тегов вы используете, тем проще вам будет управлять ими / стилизовать их. Используйте class
вместо встроенного стиля, чтобы обеспечить более чистый готовый скрипт. Класс, подобный table
тегу called table
, не очень информативен — он должен уникальным образом сообщать о том, какой стиль или поведение он будет иметь. Если все ваши <table>
теги в документе имеют class="table"
объявление, то просто удалите его полностью и используйте table
селектор в вашем css. Если в ваших таблицах есть что-то особенное, то используйте семантический язык, чтобы прояснить это.
Будет много способов закодировать это. Если вам нравится функциональный стиль кодирования, вы бы использовали array_column()
, min()
max()
для наглядности. Если вам нравится микрооптимизация для повышения производительности / простоты вычислений, вы бы использовали цикл с повторяющимися условиями для получения минимальных и максимальных значений.
Вы также должны учитывать реальную возможность того, что минимальное значение совпадает с максимальным значением. В этом случае какой цвет / класс следует применить? Я могу только произвольно догадываться, поэтому мой фрагмент даст максимальному значению приоритет стиля.
Вот один из способов сделать это:
$details['Rear Camera Megapixels']['values'] = array_column($result, 'rear_camera');
$details['Rear Camera Megapixels'][min($details['Rear Camera Megapixels']['values'])] = 'minValue';
// max will potentially overwrite the min element
$details['Rear Camera Megapixels'][max($details['Rear Camera Megapixels']['values'])] = 'maxValue';
$details['Front Camera Megapixels']['values'] = array_column($result, 'front_camera');
$details['Front Camera Megapixels'][min($details['Front Camera Megapixels']['values'])] = 'minValue';
// max will potentially overwrite the min element
$details['Front Camera Megapixels'][max($details['Front Camera Megapixels']['values'])] = 'maxValue';
<table class="table">
<thead>
<tr>
<th colspan="<?php echo count($result) 1; ?>">Camera</th>
</tr>
</thead>
<tbody>
<?php foreach ($details as $spec => $data) { ?>
<tr>
<th><?php echo $spec; ?></th>
<?php foreach ($data['values'] as $value) {
printf(
'<td%s>%s</td>',
isset($data[$value]) ? " class="{$data[$value]}"" : '',
$value
);
} ?>
</tr>
<?php } ?>
</tbody>
</table>
Тогда в вашем внешнем файле .css у вас будут объявления, похожие:
.table td.maxValue {
background-color: green;
color: darkgreen;
}
.table td.minValue {
background-color: pink;
color: red;
}
Комментарии:
1. @Hyma вы также отказались от этой страницы? Вы должны стремиться доводить каждый задаваемый вами вопрос до решения, распознаваемого системой.