我有一个带有PHP'foreach'的下拉菜单,我循环填充选择选项。这很好用。但是,我想要做的是使用“optgroup”选项有各种子标签。在我返回的数组中,我有一个“蓝色”,“绿色”和“红色”的“类型”。如何根据$ album ['type']将选择选项拆分为多个组?
这是我的代码:
$query = mysql_query("SELECT * FROM background_albums);
$albums = array();
while($row = mysql_fetch_assoc($query)) {
array_push($albums, $row);
}
<select name="backgroundList" id="backgroundList">
<? foreach($albums as $album) { ?>
<option value="<?=($row['id']);?>"><?=$row['title'];?></option>
<? } ?>
</select>
这是我想在foreach循环中实现的那种东西:
if ($album['type'] == 'green')...
<optgroup label="Green Backgrounds">
<option>1</option>
<option>2</option>
<option>3</option>
<option>4</option>
</optgroup>
if ($album['type'] == 'blue')...
<optgroup label="Blue Backgrounds">
<option>5</option>
<option>6</option>
<option>7</option>
<option>8</option>
</optgroup>
答案 0 :(得分:12)
尝试
<select name="backgroundList" id="backgroundList">
<?php
$album_type = '';
foreach ($albums as $album) {
if ($album_type != $album['type']) {
if ($album_type != '') {
echo '</optgroup>';
}
echo '<optgroup label="'.ucfirst($album['type']).' Backgrounds">';
}
echo '<option value="'.$album['id'].'">'.htmlspecialchars($album['title']).'</option>';
$album_type = $album['type'];
}
if ($album_type != '') {
echo '</optgroup>';
}
?>
</select>
答案 1 :(得分:4)
检查类型是否从先前的值更改,然后发出相应的标记。
按类型订购查询:
$query = mysql_query("SELECT * FROM background_albums order by type"); //ordered query
[...]
$type = null;
foreach ($albums as $album) {
if ($album['type'] != $type) { // type changed
if ($type !== null) {
echo '</optgroup>'; // close previous optgroup
}
$type = $album['type'];
echo '<optgroup label="' . htmlspecialchars($type) . '">'; // start optgroup
}
[...]
}
echo '</optgroup>'; // close last optgroup
答案 2 :(得分:4)
在网上搜索各种帖子之后...然后进行了大量的反复试验,我终于找到了一个效果很好的optgroup解决方案。
这段代码与tagrin0非常相似,但我想我会提供更多的评论,以帮助其他新手可能想要清楚地了解如何使这个工作没有太多的捏造和解释与代码
希望它有所帮助。
以下是表格结构......
opt_id | grp_id | optName | grpName | optAbbrv ...
echo '<select id="xxx" class="xxx"> select">';
echo '<option >Select an instance...</option>';
$dbc = mysqli_connect('localhost','xxx','xxx','xxx') or die('Error connecting to MySQL server.');
// run your query, something like
// "SELECT <optgroup>_ID, <option>_ID, <optgroup>_Name, <ption>_Name FROM [mysql table this data is stored in] ORDER BY groupID, optionID"
$select = "SELECT * FROM ci_opt ORDER BY grp_id, opt_id";
$data = @mysqli_query($dbc, $select) or die(mysql_error());
// <optgroup> of the previous <option>
$previous = "";
// variable to set the first group
$first_group = true;
while($row = mysqli_fetch_array($data)) {
// if this <option> changed <optgroup> from the previous one,
// then add a new <optgroup>
if ($row['grpName'] != $previous) {
if (!$first_group) {
echo '</optgroup>';
} else {
$first_group = false;
}
echo '<optgroup label="' . $row['grpName'] . '">';
$previous = $row['grpName'];
}
// echo the current <option>
// Note: I've also prepared the [onclick] for linking the select to an event
echo '<option id="'. $row['optAbbrv'] .'" onclick="javascript:void()">' . ucwords($row['optName']) . '</option>';
}
// close the last <optgroup> tag
echo '</optgroup>';
// close the last <select> tag
echo '</select>';
// close the connection
mysqli_close($dbc);
//结束php
答案 3 :(得分:0)
此方法不需要对数组进行排序
<select>
<?php
<!-- getting the groups to be one unique array -->
$group= array_values(array_unique(array_column($album, 'type')));
for ($i=0; $i < count($group); $i++) : ?>
<!-- for N group print -->
<optgroup label="<?=$album[$i];?>">
<!-- loop trough the hole array to check if you belong to the group -->
<?php foreach ($album as $value): ?>
<!-- if you belong then we print -->
<?php if ($group_level[$i]==$value['type']): ?>
<option>
<?=$value['type'];?>
</option>
<?php endif ?>
<?php endforeach ?>
</optgroup>
<?php endfor ?>
</select>