【问题标题】:php/mysql group list by first character按第一个字符列出的 php/mysql 组列表
【发布时间】:2018-05-28 10:01:38
【问题描述】:

我有以下 mysql 查询:

$manufacturers_query = "select m.manufacturers_id, m.manufacturers_name, m.manufacturers_image, mi.manufacturers_url
                              from manufacturers m
                              left join manufacturers_info mi on m.manufacturers_id = mi.manufacturers_id
                              order by manufacturers_name";
$manufacturers = $db->Execute($manufacturers_query);

while (!$manufacturers->EOF) {
   $man_content .= $manufacturers->fields['manufacturers_name'];
   $manufacturers->MoveNext();
}

如何使生成的列表按首字母分组并在组前添加首字母? 例如:

一个

  • 阿尔法罗密欧
  • 奥斯汀·马丁

B

  • 宝马
  • 别克

C

  • 凯迪拉克
  • 雪佛兰
  • 克尔维特

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    你可以试试这样的 -

    <?php
    
    $manufacturers_query = "select m.manufacturers_id, m.manufacturers_name, m.manufacturers_image, mi.manufacturers_url
                                from manufacturers m
                                left join manufacturers_info mi on m.manufacturers_id = mi.manufacturers_id
                                order by manufacturers_name";
    $manufacturers = $db->Execute($manufacturers_query);
    
    $last_letter = '';
    
    while (!$manufacturers->EOF) {
        $man_content = $manufacturers->fields['manufacturers_name'];
        if (strtoupper(substr($man_content, 0, 1)) != $last_letter) {
            $last_letter = strtoupper(substr($man_content, 0, 1));
            print "<h2>$last_letter</h2>";
        }
        print "<p>$man_content</p>";
        $manufacturers->MoveNext();
    }
    

    或者这可能首先创建一个由第一个字母组成的制造商索引数组 -

    <?php
    
    $manufacturers_query = "SELECT m.manufacturers_id, m.manufacturers_name, m.manufacturers_image, mi.manufacturers_url
                                FROM manufacturers m
                                LEFT JOIN manufacturers_info mi ON m.manufacturers_id = mi.manufacturers_id
                                ORDER BY manufacturers_name";
    $manufacturers = $db->Execute($manufacturers_query);
    
    $firstLetterIndexedArray = array();
    
    while (!$manufacturers->EOF) {
    
        $index = strtoupper(substr($manufacturers->fields['manufacturers_name'], 0, 1));
        $firstLetterIndexedArray[$index][] = $manufacturers->fields;
    
        $manufacturers->MoveNext();
    }
    
    print '<ol>';
    
    foreach ($firstLetterIndexedArray as $letter => $man) {
        print "<li>$letter</li><li><ol>";
    
        foreach ($man as $manufacturer) {
            print "<li>{$manufacturer['manufacturers_name']}</li>";
        }
    
        print "</ol></li>";
    }
    
    print "</ol>";
    

    【讨论】:

    • 谢谢!我使用了第二个解决方案,对 ul-li 做了一些小的修改,它很完美。谢谢
    【解决方案2】:

    您可以使用 php 轻松完成此操作。

    创建一个$currentChar = "";

    并在您的循环中获取制造商的第一个字符并将其与$currentChar 进行比较 如果$currentChar != manufacturerFirstChar

    关闭ol,将$currentChar更新为新字符,打印并打开一个新的ol

    像这样:

    $currentChar = "";
    $firstRun = true;
    $manufacturers_query = "select m.manufacturers_id, m.manufacturers_name,
                             m.manufacturers_image, mi.manufacturers_url
                              from manufacturers m
                              left join manufacturers_info mi on
                              m.manufacturers_id = mi.manufacturers_id
                              order by manufacturers_name";
     $manufacturers = $db->Execute($manufacturers_query);
    
     while (!$manufacturers->EOF) {
        $man_content .= $manufacturers->fields['manufacturers_name'];
        $temp = substr($man_content, 0, 1));
        if($temp != $currentChar)
        {
            $currentChar = $temp;
            if(!$firstRun)
            {
                // if it's not the first time, close previous li and ol
                echo "</li>";
                echo "</ol>";
            }
            else
            {
                $firstRun = false;
            }
            // print the char and open the ol
            echo "<span class=\"manChar\">".$currentChar."</span>";
            echo "<ol>";
        }
        echo "<li>".$man_content."</li>";
        $manufacturers->MoveNext();
     }
    echo "</li>";
    echo "</ol>";
    

    我没有测试过,但我相信是这样的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-18
      • 2014-12-03
      • 2010-10-19
      • 2012-05-21
      • 2010-09-30
      • 1970-01-01
      • 2011-10-29
      • 2018-01-17
      相关资源
      最近更新 更多