問題描述
我正在開發一個下拉菜單,它使用 HTML optgroups 作為員工所屬的組名稱.這是 MySQL 查詢和輸出:
<前>mysql> SELECT 雇員.emp_id,employees.empname,employees.grp_id,groups.groupname FROM 雇員離開加入組在雇員.grp_id = groups.grp_id 上按組名 asc 排序;+--------+------------+--------+-----------+|emp_id |員工姓名 |grp_id |組名 |+--------+------------+--------+-----------+|20 |員工 2 |13 |第 1 組 ||19 |員工 1 |13 |第 1 組 ||21 |員工 3 |14 |第 2 組 |+--------+------------+--------+-----------+3 行(0.00 秒)唯一的問題是,我最難弄清楚如何讓 optgroup 正常工作.我已經嘗試了無數次,它真的開始讓我感到沮喪.以下幾乎是我想要的輸出(示例):
基本上,optgroup 需要是groupname",選項name"應該是emp_id",動作option"(下拉項)是empname".
我希望這是可以做到的,但真的不確定.這是我擁有的功能,但效果不佳:
function getDynGrpList() {全球 $db;//$query = "SELECT * FROM員工 ORDER BY grp_id desc;";$query = "選擇雇員.emp_id,employees.empname,employees.grp_id,groups.groupname FROM 雇員離開加入組雇員.grp_id = groups.grp_id 按組名 asc 排序;";$employees = $db->GetAll($query);$groups = array();而 ($qa = $employees->GetRows()) {$groups[$qa['groupname']][$qa['grp_id']] = $qa['empname'];}foreach ($groups as $label => $opt) { ?><optgroup label="<?php echo $label; ?>"><?php }foreach ($groups[$label] as $id => $name) { ?><option value="<?php echo $id; ?>"><?php echo $name;?></option><?php } ?></optgroup><?php }
getDynGrpList 函數截至美國中部標準時間凌晨 3:15 (2/27):
function getDynGrpList() {全球 $db;//$query = "SELECT * FROM員工 ORDER BY grp_id desc;";$query = "選擇雇員.emp_id,employees.empname,employees.grp_id,groups.groupname FROM 雇員離開加入組雇員.grp_id = groups.grp_id 按組名 asc 排序;";$employees = $db->GetAll($query);$groups = array();而 ($qa = $employees->GetRows()) {$groups[$qa['groupname']][$qa['emp_id']] = $qa['empname'];}var_export($groups);foreach($groups as $label => $opt): ?><optgroup label="<?php echo $label; ?>"><?php foreach ($opt as $id => $name): ?><option value="<?php echo $id; ?>"><?php echo $name;?></option><?php endforeach;?></optgroup><?php endforeach;}
最終解決方案(在 Felix Kling 的幫助下)
function getDynGrpList() {全球 $db;$query = "選擇雇員.emp_id,employees.empname,employees.grp_id,groups.groupname FROM 雇員離開加入組雇員.grp_id = groups.grp_id 按組名 asc 排序;";$employees = $db->GetAll($query);$groups = array();foreach ($employees 作為 $employee) {$groups[$employee['groupname']][$employee['emp_id']] = $employee['empname'];}foreach($groups as $label => $opt): ?><optgroup label="<?php echo $label; ?>"><?php foreach ($opt as $id => $name): ?><option value="<?php echo $id; ?>"><?php echo $name;?></option><?php endforeach;?></optgroup><?php endforeach;}
這兩個 for 循環沒有嵌套在你的代碼中:
foreach ($groups as $label => $opt) { ?><optgroup label="<?php echo $label; ?>"><?php } <-- 這里錯了foreach ($groups[$label] as $id => $name) { ?><option value="<?php echo $id; ?>"><?php echo $name;?></option><?php } ?>
結果是首先創建了所有 opt 組,然后添加了最后一組的員工(因為 $label
和 $opt
在循環后也可用完成).
你必須嵌套循環(使用替代語法控制結構):
$opt): ?><optgroup label="<?php echo $label; ?>"><?php foreach ($opt as $id => $name): ?><option value="<?php echo $id; ?>"><?php echo $name;?></option><?php endforeach;?></optgroup><?php endforeach;?>
此外,我認為您必須在創建數組時使用 emp_id
,而不是 grp_id
:
while ($qa = $employees->GetRows()) {$groups[$qa['groupname']][$qa['emp_id']] = $qa['empname'];}
I am developing a drop down menu that uses HTML optgroups for group names that employees are a part of. Here is the MySQL query and output:
mysql> SELECT employees.emp_id,employees.empname,employees.grp_id,groups.groupname FROM employees left join groups on employees.grp_id = groups.grp_id order by groupname asc; +--------+------------+--------+-----------+ | emp_id | empname | grp_id | groupname | +--------+------------+--------+-----------+ | 20 | Employee 2 | 13 | Group 1 | | 19 | Employee 1 | 13 | Group 1 | | 21 | Employee 3 | 14 | Group 2 | +--------+------------+--------+-----------+ 3 rows in set (0.00 sec)
The only issue is, I'm having the hardest time figuring out how to get the optgroup to work correctly. I've tried countless times, and it's really starting to frustrate me. The following is pretty much I want the output to be (example):
<select name="dropdownmenu">
<optgroup label="Group 1">
<option name="20">Employee 2</option>
<option name="19">Employee 1</option>
</optgroup>
<optgroup label="Group 2">
<option name="21">Employee 3</option>
</optgroup>
</select>
Basically, the optgroup needs to be the "groupname", the option "name" should be the "emp_id", and the action "option" (drop down item) is the "empname".
I hope this is something that can be done, but really not sure. Here's the function I have, but it doesn't exactly work well:
function getDynGrpList() {
global $db;
// $query = "SELECT * FROM employees ORDER BY grp_id desc;";
$query = "SELECT employees.emp_id,employees.empname,employees.grp_id,groups.groupname FROM employees left join groups on employees.grp_id = groups.grp_id order by groupname asc;";
$employees = $db->GetAll($query);
$groups = array();
while ($qa = $employees->GetRows()) {
$groups[$qa['groupname']][$qa['grp_id']] = $qa['empname'];
}
foreach ($groups as $label => $opt) { ?>
<optgroup label="<?php echo $label; ?>">
<?php }
foreach ($groups[$label] as $id => $name) { ?>
<option value="<?php echo $id; ?>"><?php echo $name; ?></option>
<?php } ?>
</optgroup>
<?php }
getDynGrpList function as of 3:15AM CST (2/27):
function getDynGrpList() {
global $db;
// $query = "SELECT * FROM employees ORDER BY grp_id desc;";
$query = "SELECT employees.emp_id,employees.empname,employees.grp_id,groups.groupname FROM employees left join groups on employees.grp_id = groups.grp_id order by groupname asc;";
$employees = $db->GetAll($query);
$groups = array();
while ($qa = $employees->GetRows()) {
$groups[$qa['groupname']][$qa['emp_id']] = $qa['empname'];
}
var_export($groups);
foreach($groups as $label => $opt): ?>
<optgroup label="<?php echo $label; ?>">
<?php foreach ($opt as $id => $name): ?>
<option value="<?php echo $id; ?>"><?php echo $name; ?></option>
<?php endforeach; ?>
</optgroup>
<?php endforeach;
}
Final Solution (with the help of Felix Kling)
function getDynGrpList() {
global $db;
$query = "SELECT employees.emp_id,employees.empname,employees.grp_id,groups.groupname FROM employees left join groups on employees.grp_id = groups.grp_id order by groupname asc;";
$employees = $db->GetAll($query);
$groups = array();
foreach ($employees as $employee) {
$groups[$employee['groupname']][$employee['emp_id']] = $employee['empname'];
}
foreach($groups as $label => $opt): ?>
<optgroup label="<?php echo $label; ?>">
<?php foreach ($opt as $id => $name): ?>
<option value="<?php echo $id; ?>"><?php echo $name; ?></option>
<?php endforeach; ?>
</optgroup>
<?php endforeach;
}
The two for loops are not nested in your code:
foreach ($groups as $label => $opt) { ?>
<optgroup label="<?php echo $label; ?>">
<?php } <-- wrong here
foreach ($groups[$label] as $id => $name) { ?>
<option value="<?php echo $id; ?>"><?php echo $name; ?></option>
<?php } ?>
The result is that first all opt groups are created and then the employees for the last group are added (because $label
and $opt
are also available after the loop finished).
You have to nest the loops (using alternative syntax for control structures):
<?php foreach($groups as $label => $opt): ?>
<optgroup label="<?php echo $label; ?>">
<?php foreach ($opt as $id => $name): ?>
<option value="<?php echo $id; ?>"><?php echo $name; ?></option>
<?php endforeach; ?>
</optgroup>
<?php endforeach; ?>
Furthermore, I think you have to use the emp_id
, not the grp_id
when creating the array:
while ($qa = $employees->GetRows()) {
$groups[$qa['groupname']][$qa['emp_id']] = $qa['empname'];
}
這篇關于PHP:使用 optgroup 動態下拉的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!