PHP MySQL按三个字排列html输出,按组的第一个字母排序

时间:2016-10-12 16:16:29

标签: php html mysql output

这是我现在的代码:

<?php

$sql = DB::query("SELECT name FROM stores ORDER BY name");
foreach ($sql as $row){ $name = $row["name"]; }

// don't know how to get the current letter
$current_letter = '?';

// Set the start at 1
$i = 1;
foreach ($sql as $row){
    // If the loop hits 1, add <div>
    if($i == 1)

echo '<div class="store-wrapper">'.PHP_EOL;

echo '<div class="store-letter">Store Letter - '. $current_letter .'</div>'.PHP_EOL;
echo '<ul>'.PHP_EOL;

    echo $id = "\t<li>".$name.'</li>'.PHP_EOL;
    // If the loop hits 3, add </div>
    if($i == 3) {
        echo '</ul>'.PHP_EOL;
        echo '</div>'.PHP_EOL; // end .store-wrapper
        // Reset the counter
        $i = 0;
    }
    // Increment up
    $i++;
}

?>

我的代码有问题吗?这是我想要实现的代码输出:

<div class="store-wrapper">
<div class="store-letter">Store Letter - A</div>
<ul>
<li>ajhgjgj</li>
<li>abgjkhjh</li>
<li>avbnvnmnm</li>
</ul>
</div>

<div class="store-wrapper">
<div class="store-letter">Store Letter - B</div>
<ul>
<li>bgfghfj</li>
<li>bhgjhgj</li>
<li>bvkjhgkj</li>
</ul>
</div>

<div class="store-wrapper">
<div class="store-letter">Store Letter - C</div>
<ul>
<li>cgfghfj</li>
<li>chgjhgj</li>
<li>cvkjhgkj</li>
</ul>
</div>

另一件事是,我真的不知道如何获得每个小组的第一个字母。

代码的问题在于输出不会显示为上面的示例,当达到最大3 <li>时,这些组不会与下一个可用字母混在一起。

我做错了什么?

2 个答案:

答案 0 :(得分:1)

您不需要第一个foreach循环。它只是重复分配相同的变量$name。您可以在回显DIV的循环中执行此操作。

您可以使用$name[0]获取字符串的第一个字母。

不是测试$i == 3知道何时关闭UL和DIV,而是测试$i > 3以跳过打印名称。否则,如果一个字母在其组中只有1个或2个名字,您将永远不会关闭该组。

$current_letter = null;
foreach ($sql as $row) {
    $name = $row['name'];
    $first_letter = $name[0];
    if ($first_letter != $current_letter) {
        $i = 1;
        if ($current_letter) { // close the previous DIV before starting new one
            echo '</ul>'.PHP_EOL;
            echo '</div>'.PHP_EOL;
        }
        $current_letter = $first_letter;
        echo '<div class="store-wrapper">'.PHP_EOL;
        echo '<div class="store-letter">Store Letter - '. $current_letter .'</div>'.PHP_EOL;
        echo '<ul>'.PHP_EOL;
    }
    if ($i > 3) {
        continue;
    }
    echo "\t<li>".$name.'</li>'.PHP_EOL;
    $i++;
}
if ($current_letter) { // close the last DIV
    echo '</ul>'.PHP_EOL;
    echo '</div>'.PHP_EOL;
}

DEMO
output

答案 1 :(得分:0)

1.如果没有使用for循环,你也可以使用$test = array_column($sql,'name'); php函数来获取$ sql中的'name'。例如,$test[0]。 2.之后substr($test[0], 0, 1)会给出数组中的第一个名字。 3.要获得第一个字符,请使用AppHost.Configure()