【问题标题】:How can I add an option to a foreach loop selectbox sorted by name?如何将选项添加到按名称排序的 foreach 循环选择框?
【发布时间】:2018-07-25 01:45:36
【问题描述】:

我的选择框中有一个选项循环。它们按名称排序:

 <select>
    <?php
      $pdo = $db->query('SELECT * FROM data ORDER BY name ASC;');
      while ($row = $pdo->fetch(PDO::FETCH_ASSOC)) {
            echo '<option>".$row['name']."<option>
       }
   ?>
 </select>

结果如下所示:

<select>
<option>Alfred</option>
<option>Berta</option>
<option>Jane</option>
<option>Victor</option>
</select>

我现在想在选择框中手动添加另一个选项:

<option>Tamara</option>

但它也应该排序,所以我的结果将是:

<select>
<option>Alfred</option>
<option>Berta</option>
<option>Jane</option>
<option>Tamara</option>
<option>Victor</option>
</select>

这怎么可能?

【问题讨论】:

    标签: php html select foreach


    【解决方案1】:

    你必须使用 PHP sort()

    <?php
        $data = [] ; // use an array to store your data.
        $pdo = $db->query('SELECT * FROM data ORDER BY name ASC;');
        while ($row = $pdo->fetch(PDO::FETCH_ASSOC)) {
            $data[] = $row['name'] ; // add into data
        }
        // add your value :
        $data[] = "Tamara" ;
        // then sort 
        sort($data);
    ?>
    <select>
    <?php
        foreach ($data as $item) {
            echo '<option>'.$item.'</option>' ;
        }
    ?>
    </select>
    

    请注意,在这种情况下,您的 ORDER BY 不再需要。

    【讨论】:

      【解决方案2】:

      您需要构建自己的数组并使用natcasesort(),因为它的排序比标准的sort() 更好。 Sorting arrays comparison chart.

      <select>
      <?php
      // A listing of names you wish to manually add
      $names = [ 'Tamara', 'Jack' ];
      
      // Add names from the database
      $pdo = $db->query('SELECT * FROM data ORDER BY name ASC;');
      while ($row = $pdo->fetch(PDO::FETCH_ASSOC))
      {
          $names[] = $row['name'];
      }
      
      // Perform a proper sort
      natcasesort( $names );
      
      // Loop and output
      foreach( $names as $name )
      {
          echo '<option>'.$name.'</option>';
      } 
      ?>
      </select>
      

      按 cmets 更新

      你需要usort()的力量

      <select>
      <?php
      // A listing of rows you wish to manually add
      // Since these are not from the database, we need to manually assign the "columns" to be used later
      $rows = [
          [ 'name' => 'Tamara', 'id' => 'fake id', 'project' => 'whatever', 'group' => 'some group' ],
          [ 'name' => 'Jack', 'id' => 'fake id 2', 'project' => 'whatever 2', 'group' => 'some group 2' ]
      ];
      
      // Add rows from the database
      $pdo = $db->query('SELECT * FROM data ORDER BY name ASC;');
      while ($row = $pdo->fetch(PDO::FETCH_ASSOC))
      {
          $rows[] = $row;
      }
      
      // Perform a sort which targets the name
      usort( $rows, function( $a, $b ){
          return strcmp( $a['name'], $b['name'] );
      } );
      
      // Loop and output
      foreach( $rows as $data )
      {
          echo '<option value='.$data['id'].' data-project='.$data['project'].' data-group='.$data['group'].'>'.$data['name'].'</option>';
      } 
      ?>
      </select>
      

      【讨论】:

      • 谢谢!一个问题,我在循环中的选择有更多的价值。像这样&lt;option value='.$row['id'].' data-project='$row['project']' data-group='$row['group']'&gt;'.$row['name'].'&lt;/option&gt;你的解决方案可以吗?
      • @Jarla 当然是。我想你想知道怎么做?
      • 我现在正在努力,怎么做。但还是没有成功:)
      • @Jarla 查看更新。我还没有测试过,但它应该可以工作
      • 嗯好的,明白了。非常感谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-19
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 2018-06-23
      • 1970-01-01
      相关资源
      最近更新 更多