【问题标题】:Dynamic Optgroup in PHPPHP 中的动态 Optgroup
【发布时间】:2017-08-17 13:32:55
【问题描述】:

这是我当前用来为我的 php 下拉列表抓取数据的 SQL 表。这样做的主要目标是把它变成一个下拉菜单,其中有一个 optgroup,下面的成员等等......

+-----------+------------+-----------+
| GroupName | MemberName | ValueName |
+-----------+------------+-----------+
| 1st Team  | Joe Bob    | Joe       |
| 1st Team  | Catherine  | Kat       |
| 2nd Team  | Tommy      | Tom       |
| 3rd Team  | John Razks | John      |
+-----------+------------+-----------+
 Table name: Members

最终结果基本上是下面的代码。这将是一个下拉菜单,其中包含一个名为“1st Team”的 optgroup,并具有以下成员等。用于二队和三队等。

<optgroup class="1st Team">
  <option value="Joe">Joe Bob</option>
  <option value="Kat">Catherine</option>
</optgroup>
<optgroup class="2nd Team">
  <option value="Tom">Tommy</option>
</optgroup>
<optgroup class="3rd Team">
  <option value="John">John Razks</option>
</optgroup> 

现在,这就是我从 SQL 表中获取信息的方式。这很好用,但如果我想添加一个新的 GroupName,那么我必须在我的主页上添加一个新代码,我不想这样做。

尝试使其动态化,因此如果 SQL 表使用新的 GroupName 进行更新,那么下拉列表中将出现一个新的 optgroup 类,并且成员将位于下方。

<optgroup class="1st Team">
		<?php
			$conn = mysqli_connect("#connect_to_sql");

			if(!$conn){
				die("Connection Failed".myslqi_connect_error());
			}
				$result = mysqli_query($conn, "SELECT distinct MemberName from Members where GroupName = "1st Team" order by MemberName ASC");
				while ($row = mysqli_fetch_assoc($result)){
				unset($membername, $groupname);
				$groupname = $row['GroupName'];
				$membername = $row['MemberName'];
				echo '<option value="'.$membername.'">'.$membername.'</option>';
			}
		?>	
</optgroup>

我完全不知道该怎么做。我看过其他人的例子,但不知道如何处理这一步。

【问题讨论】:

    标签: php mysqli dynamic drop-down-menu optgroup


    【解决方案1】:

    首先从数据库中获取所有记录。创建一个以键为组名的数组。循环新数组以生成所需的输出。

    // query to get all records from database table
    $result = mysqli_query($conn, "SELECT distinct MemberName,GroupName,ValueName from Members order by MemberName ASC");
    while ($row = mysqli_fetch_assoc($result)){
        // generate an array with keys as group name
        $array[$row['GroupName']][] = $row;
    }
    
    // loop the array to create optgroup
    foreach($array as $key=>$value){
        // check if its an array
        if(is_array($value)){
            // create optgroup for each groupname
            echo "<optgroup class='".$key."'>";
            foreach($value as $k=>$v){
                echo "<option value='".$v['membername']."'>'".$v['membername']."'</option>";
            }
            echo "</optgroup>";
        }
    }
    

    我尚未对此进行测试,但肯定会对您有所帮助。而且你可以做出改进。

    【讨论】:

      【解决方案2】:

      这不是最优雅的方式,但您可以通过这种方式构建您的组,它所做的是检查组的名称并在每次名称更改时将其更改为新的 optgroup,$first var 就在那里它不会在第一次添加结束标记。

      我相信你可以改进这一点,但它应该能让你继续前进。

      它确实依赖于组名称的一致命名约定,所以正如我所说,我相信您可以改进它。我也没有像您在示例中所做的那样包含连接检查

      $result = mysqli_query($conn, "SELECT * FROM Members ORDER BY GroupName");
      $groupName = '';
      $first = true;
      echo '<select>';
      while ($row = mysqli_fetch_assoc($result)){
          if ($row['GroupName'] != $groupName) {
              $groupName = $row['GroupName']; // Just set the new group name
              if (!$first) { // Add a closing tag when we change the group, but only if we're not in the first loop
                  echo '</optgroup>';
              } else {
                  $first = false; // Make sure we don't close the tag first time, but do after the first loop
              }
              echo '<optgroup label="' . $groupName . '">';
          }
          // We want to echo the options every loop so it's outside the if condition
          echo '<option value="' . $row['MemberName'] . '">' . $row['ValueName'] . '</option>';
      }
      echo '</select>';
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-23
        • 2021-06-22
        • 2018-06-13
        相关资源
        最近更新 更多