【问题标题】:PHP MySQL arrange html output three by three, order by first letter of groupPHP MySQL 将 html 输出三三排,按组的首字母排序
【发布时间】:2016-10-12 16:16:29
【问题描述】:

这是我现在拥有的代码:

<?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 &lt;li&gt; 时,组不会跳转到下一个可用字母。

我做错了什么?

【问题讨论】:

  • 在声明 $name 变量后,您将关闭您的第一个 foreach。
  • 第一个foreach 循环只是不断覆盖$name 变量。在循环之后,它包含最后一行的名称。
  • 你可以用$row['name'][0]获取名字的第一个字母。

标签: php html mysql output


【解决方案1】:

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

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

不是测试$i == 3 以了解何时关闭UL 和DIV,而是测试$i &gt; 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

【讨论】:

  • 这仍然不起作用。代码输出:jsfiddle.net/0xc6emc5
  • 抱歉,我混淆了变量名,有时使用$last_letter 而不是$current_letter。立即尝试。
  • 现在几乎完美了,但是在代码之前它添加了`
    Store Letter - A
    ` *注意第一个&lt;ul&gt;
  • 必须在if之后设置$current_letter,因此只有在已经打开DIV时才会关闭DIV。
  • * 同一个字母有多个分类
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-29
    • 2021-09-21
    • 2017-02-28
    • 2013-03-18
    相关资源
    最近更新 更多