2011-02-27 47 views
6

我正在開發一個下拉菜單,該菜單使用HTML optgroups作爲員工參與的組名。下面是MySQL數據庫的查詢和輸出:PHP:使用optgroup進行動態下拉

 
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) 

唯一的問題是,我在最困難的時候搞清楚如何讓OPTGROUP正常工作。我試過無數次,真的開始讓我感到挫折。 以下是相當多我想要的輸出是(例如):

<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> 

基本上,OPTGROUP需要是「組名」中,選擇「名稱」應該是「EMP_ID」,和動作「選項」(drop down item)是「empname」。

我希望這是可以做的事情,但真的不確定。這是我具備的功能,但它並不完全正常工作:

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功能凌晨3:15 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; 
} 

最終解決方案(以費利克斯·克林的幫助下)

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; 
} 

回答

5

兩個for循環不能嵌套在代碼:

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 } ?> 

其結果是,第一個被創建的所有選擇組,然後在最後一組的員工都加入(因爲$label$opt也可在循環結束後)。

你必須嵌套循環(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; ?> 

此外,我認爲你必須創建陣列時使用的emp_id,而不是grp_id

while ($qa = $employees->GetRows()) { 
    $groups[$qa['groupname']][$qa['emp_id']] = $qa['empname']; 
} 
+0

實際上,我用代碼得到一個空白的下拉菜單。你的代碼和我的代碼實際上並不顯示任何下拉菜單。在代碼的某處,有一個問題,只是不知道在哪裏。 – drewrockshard 2011-02-27 09:03:03

+0

@drewrockshard:在循環前面創建一個'var_export($ groups)'並查看數組是否包含數據以及它具有什麼結構。 – 2011-02-27 09:07:15

+0

我更新了我的初始帖子。在添加var_export($ groups)之後,也沒有輸出。也許如果你可以看看我的整個功能,也許你可以發現一些錯誤。 – drewrockshard 2011-02-27 09:15:49