Я строю веб-сайт, и у него есть список выбора, сгруппированный по штатам. Есть ли более эффективный способ написания этого списка выбора, поэтому у меня не так много разных циклов записи?
В моей базе данных есть таблица с именем location:
id region state
1 Sydney NSW
2 Newcastle NSW
3 Wollongong NSW
4 Wagga Wagga NSW
5 Geelong Vic
…так далее
В настоящее время я распечатываю их в списке выбора, сгруппированном по состоянию, как это.
<select name="location" id="location">
<?php
$locations = getTable("location", $DB);
$locationsByState = [];
//chunk array by state
foreach($locations as $loc)
{
$locationsByState[$loc['state']][] = $loc;
}
?>
<optgroup label="NSW">
<?php
foreach($locationsByState['NSW'] as $opt)
echo '<option>' . $opt['region'] .'</option>'
?>
</optgroup>
<optgroup label="QLD">
<?php
foreach($locationsByState['QLD'] as $opt)
echo '<option>' . $opt['region'] .'</option>'
?>
</optgroup>
<optgroup label="SA">
<?php
foreach($locationsByState['SA'] as $opt)
echo '<option>' . $opt['region'] .'</option>'
?>
</optgroup>
<optgroup label="VIC">
<?php
foreach($locationsByState['VIC'] as $opt)
echo '<option>' . $opt['region'] .'</option>'
?>
</optgroup>
<optgroup label="TAS">
<?php
foreach($locationsByState['TAS'] as $opt)
echo '<option>' . $opt['region'] .'</option>'
?>
</optgroup>
<optgroup label="WA">
<?php
foreach($locationsByState['WA'] as $opt)
echo '<option>' . $opt['region'] .'</option>'
?>
</optgroup>
<optgroup label="ACT">
<?php
foreach($locationsByState['ACT'] as $opt)
echo '<option>' . $opt['region'] .'</option>'
?>
</optgroup>
<optgroup label="NT">
<?php
foreach($locationsByState['NT'] as $opt)
echo '<option>' . $opt['region'] .'</option>'
?>
</optgroup>
</select>
Вы можете покрыть это в 2 простых цикла, как показано ниже:
<select name="location" id="location">
<?php
$locations = getTable("location", $DB);
$locationsByState = [];
// chunk array by state
foreach($locations as $loc)
{
$locationsByState[$loc['state']][] = $loc;
}
foreach($locationsByState as $label => $value) {
?>
<optgroup label="<?= $label; ?>">
<?php
foreach($value as $opt) {
echo '<option>' . $opt['region'] .'</option>'
}
?>
</optgroup>
<?php
}
?>
</select>
Других решений пока нет …